問題タブ [grammar-kit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
intellij-idea - カスタム言語の BNF ルール構文の強調表示
Grammar-Kit プラグインを使用して、IntelliJ 用のカスタム言語プラグインを開発しようとしています。定義されたトークンの構文の強調表示を簡単に提供できますが、要素またはトークンの親レベルで強調表示する方法がわかりません。
ここに簡単で汚い言語の例があります - https://github.com/carymrobbins/intellij-plugin-example
解決
@ignatov が示唆するように、Annotator クラスを拡張し、それを に登録しますplugin.xml
。以下の例では、メソッドcommand
を定義して要素を強調表示しています。visitCommand
comma - Grammar-Kit の式からカンマ演算子を除外するには?
コンマ演算子を含む C 派生言語用の IntelliJ 言語プラグインを作成しています。Grammar-Kit を使用してパーサーを生成しています。正式な文法には入れ子になった式の生成が多数あるため、 Grammar-Kit の優先度に基づく式の解析を使用してそれらを書き直したので、式の生成は次のようになります。
これ自体は問題なく機能しますが、文法にはコンマ式にできない式を解析する必要がある場所があります。関数呼び出しは、この一例です。
関数の引数をカンマ式にすることはできません。これは、次の引数をカンマで区切るとあいまいになるためです。(私が今持っている文法では、常に単一のコンマ式として解析されます。) 正式な文法では、関数の各引数が代入式でなければならないことを指定することでこれを処理します。代入式には、より優先順位の高いすべての式が含まれるためです。これは、Grammar-Kit の優先度ベースの文法では機能しません。代入式には実際に代入を含める必要があるからです。
同じことがイニシャライザにも当てはまります。コンマ式を許可すると、 のような場合にあいまいな解析につながりますint x=1, y;
。
この状況にどのように対処すればよいですか?浅い PSI ツリーを維持するために優先度ベースの解析を使い続けたいと思いますが、関数呼び出しの PSI ツリーを手動で書き直して aCommaExpression
を引数リストに変換することも避けたいと思います。
recursion - LiveScript オブジェクト定義の解析で左再帰を回避する
私は LiveScript 言語のパーサーに取り組んでおり、両方のオブジェクト プロパティ定義フォームを一緒に解析するのに問題がありkey: value
ます(+|-)key
。例えば:
私はkey: value
これで動作するフォームを持っています:
しかし、 orに追加しよ("+"|"-") IDENTIFIER
うとすると、左再帰の使用に関するエラーが発生します。これを行う(正しい)方法は何ですか?PropDefExpression
ObjDefExpression
parsing - Elm ケース式の解析が関数呼び出しと衝突する
JFlex と Grammar Kit を使用して、Elm 言語用の Intellij プラグインを開発しています。パーサーを書いた経験はほとんどありません。
関数呼び出しと競合するため、case 式を解析できません。
BNF 仕様は次のとおりです。
次の例では、パーサーは 84 が新しい case_body_part の開始であることを認識していません
Grammar Kit を知っている人がいたら教えていただけるとありがたいです。ただし、視聴者が一般的にパーサーを知っている可能性が高いという前提で:
1) より良い BNF でこれを修正できますか?
2) どのような構文解析概念が含まれているか。
3) yacc などの別のパーサーがこれをどのように処理するか教えていただけますか。
intellij-idea - Grammar-Kit を使用して BNF ルールを作成する方法
EBNF ファイルを IntelliJ Grammar-kit 用の動作する BNF に変換しようとしています。
EBNF には、次のような規則があります。
正規表現に頼らずにそのようなルールを作成するにはどうすればよいですか? その理由は、この種の構成が非常に頻繁に発生し、正規表現で行うと繰り返しになるためです。
@@
明確にするために、一致するBinOpChar
が一致しないルールを作成できるようにしたいと思います@ @
。それは可能ですか?
parsing - IntelliJ: Grammar-Kit / BNF: エラーから回復するには?
IntelliJ 用のカスタム言語プラグインを作成しています。
これは、言語の簡単な例です。構造が再帰的であることに注意してください。
FLEX ファイルと BNF ファイルを正常に実装しましたが、エラー リカバリを追加する方法がわかりません。RecoverWhileについて読み、Grammar-Kit の HOWTOにピン留めしましたが、それらを自分のシナリオに適用する方法がわかりません。
上記の茶色のアイテム(「aaa」、「ccc」など)を「アイテム」と呼びます。
黄色いもの (「bbb」、「ddd」、...) を「プロパティ」と呼びます。
各項目には、項目名(例: "aaa")、単一のプロパティ(例: "bbb") があり、他の項目を含めることができます (例: "aaa" には "ccc"、"eeee"、および "gg" が含まれます)。
現時点では、アイテムの形式が正しくない場合、プラグインは適切に動作しません。例えば:
この例では、"ccc" がプロパティのないアイテムの名前であることをパーサーに "理解" させたいと考えています (たとえば、閉じ括弧の前の改行を検出することによって)。
壊れた「ccc」項目が「eeee」の解析に影響を与えたくありません (ただし、テキストに存在する「ccc」の要素 (この場合は名前) を PSI ツリーに含めたいと思います)。
私が使用するFLEXとBNFは次のとおりです。
フレックス:
BNF:
intellij-plugin - Grammar-Kit の生成されたレクサー Java ファイルが生成されるパスを変更するにはどうすればよいですか?
Grammar-Kit で生成された JFlex lexer Java ファイルが生成されるパスを変更するにはどうすればよいですか?
Grammar-Kit の issue trackerで質問しましたが、回答がありません。
レクサーが生成されたファイルのディレクトリに配置されないことにうんざりしています (他のすべての生成されたファイルと一緒に簡単に削除して、検索や IDE の警告などから除外することができます)。