問題タブ [grako]
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.
parsing - Grako 生成パーサーによるエラー出力の改善
Grako で生成されたパーサーのユーザーに表示されるエラーを改善する最善の方法を見つけようとしています。入力ファイルで解析の問題が発生したときに Grako が生成したパーサーによって表示されるデフォルトの解析エラーは役に立たないようです。エラーは、多くの場合、問題が入力ファイルの一部にあることを暗示しているように見えますが、実際のエラーは別の場所にあります。
私はGrako Semanticsクラスを調べて、チェックが失敗した場合により良いエラーメッセージを表示するいくつかのチェックを入れましたが、すべてをキャッチできるように指定する必要があるエッジケースがたくさんあるようです.ルールの解析が失敗する可能性のある方法。
私が見ることができる推奨事項や例はありますか?
python - 「FailedParse: [...] Expecting end of text」が grako で括弧内の式を解析しようとすると
には、 3.14.0search_query.ebnf
の次の文法定義があります。grako
でパーサーを生成します
結果は、これらの入力に対して期待どおりに機能します。
しかし、演算子の右側に括弧で囲まれた式がある場合、パーサーはエラー メッセージを表示します。
私は何か間違ったことをしていますか?
grako - 再帰ルールで {} に一致する空の要素を無視する
ネスト可能な状態について説明したいと思います。これが私が取り組んでいるものです:
次のような行で AST を生成できます。
ここで AST :
しかし、「bar」の後に空のリストがあります。これは、条件ルールが最後に一致したときと推測されるため、「condop 条件」は空の文字列に値します。ドキュメントhttps://pypi.python.org/pypi/grako/3.16.0によると、{} は空のリストを生成します。
これが起こらないようにする方法はありますか?
python - 有用なエラーで 1 つ以上の式を解析します
私は grako (Python 用の PEG パーサー ジェネレーター ライブラリ) を使用して、ドキュメントに 1 つ以上のプロトコルを含めることができる単純な宣言型言語を解析しています。
もともと、ドキュメントのルート ルールは次のように記述されていました。
document = {protocol}+ ;
これはプロトコルのリストを適切に返しますが、構文エラーが最初のプロトコルにある場合にのみ役立つエラーを返します。それ以外の場合は、無効なプロトコルとそれ以降のすべてを黙って破棄します。
また、いくつかのバリエーションを試しました:
しかし、プロトコルが 1 つしかない場合、これはリストにはなりません。また、いずれかno available options: (...) document
のプロトコルにエラーが含まれている場合にのみ、有用なエラー メッセージも表示されません。
次の両方を行うルールを作成するにはどうすればよいですか?
- プロトコルが 1 つしかない場合でも、常にリストを返します
- 単に無効なドキュメントだと言ったり、破損したプロトコルを黙って削除したりするのではなく、一致の失敗に関する役立つエラー メッセージを表示します。
grako - Grako で ModelBuilderSemantics を使用してネストされたオブジェクトを回避する
以下の文法を見ると、より具体的な式タイプに解析される主要なルールである式が表示されます。
以下の test_input の解析は期待どおりに機能しますが、式ルールの and_expr 要素に「andex」ではなく「@」のラベルを付けたいと思います。私の希望は、解析された出力が Expression オブジェクトの not_ex 要素内にある CompareExpression オブジェクトのみになることでした。
and_expr 要素で「@」ラベルを使用すると、Expression オブジェクトに属性が表示されないようです! これはバグですか、それとも意図的なものですか? ModelBuilderSemantics を使用する場合、すべての要素に名前を付けて「@」ラベルを使用しないようにする必要がありますか?
私が直面しているもう 1 つの問題は、comp_expr などの後のルールに関連付けられたクラス名がない場合、その要素は印刷時に辞書に表示されますが、ドット表記のアクセサーは AttributeError で失敗することです。 : 'dict' オブジェクトには属性 'comp' がありません". ルールにクラス名が関連付けられていない場合でも、ドット表記アクセサーを使用する方法はありますか?
python - grako を使用した状況依存のコード生成
Grako のモデル ビルダー セマンティクスを使用して抽象構文ツリー (AST) を構築した状況にいます。次に、その AST から JavaScript コードを生成する必要があります。いくつかのテンプレートを定義しましたが、単純なテンプレートですべてのケースを処理できるわけではないことに気付きました。私がこだわっている具体的なルールは次のとおりです。
このルールは、単純な関数呼び出しとコンストラクター呼び出しの両方に一致します。どちらがどちらであるかを字句的に判断する方法がないため、その名前を持つクラスがそのスコープ内で定義されているかどうかによって異なります。
たとえば、「a = Func();」
JavaScript では、2 つのケースで異なる構文が必要です (「a = new Func();」または「a = Func();」)。
そのため、どれがどれであるかを追跡するためのシンボル テーブルが必要です。グラコでこれを達成する方法はありますか?
追加情報:
これを行う方法に関する私の考え: シンボル テーブルを構築する walker クラスを作成し、それが FunctionCall オブジェクトを処理するときに、それが実際にコンストラクター呼び出しであるかどうかを確認し、その場合は FunctionCall ノードを ConstructorCall ノードに置き換えます。次に、2 つのテンプレートを 2 つ用意します。
このアプローチについて私が気に入らないのは、分離しすぎているように感じられ、テンプレートごとに新しいクラスが必要になることです。
bnf - グラコ左再帰
グラコを使用して単純な左再帰文法を記述しようとしていますが、うまくいきません。
右再帰は問題なく動作します:
私が見つけたすべての例によると、左再帰は次のように説明する必要があります。
ただし、以下のルールでは機能しません。
このエラーが発生します:
この時点で私が理解しているのは、ルールの最初の文字はではsymbol
なく一致condition "AND" symbol
するため、グラコはそれを使用したいと考えているということです。しかし、私の開始ルールは、すべてのキャラクターが消費されたことを強制します。
私はまだ多くの回避策を使用しようとしましたが、適切なものを見つけることができませんでした.