問題タブ [ambiguous-grammar]
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 - Sablecc を使用して競合をシフト/削減する
Sablecc を使用して、MiniPython 用の .grammar ファイルを作成することになっています。これらのシフト/削減の競合が発生しています:
トークンの一部は次のとおりです。
私の .grammar ファイルの一部は次のとおりです。
これは、左再帰を排除しようとした後の文法です。assert
プロダクションからルールを削除するsomething
と、競合が発生しないことに気付きました。また、およびルール{empty}
からルールを削除しても競合は発生しませんが、これはこれを解決する正しい方法ではないと思います。exprsn
tpwr
mltp
ヒントをいただければ幸いです。
更新: 要求に応じて、左再帰を削除する前の文法全体を次に示します。
shift/reduce 競合は次のようになります。
scala - キーワードと識別子の競合書き込みレクサー? (スカラライブラリ)
fastparse、parboiled2、scala-combinators を試しました。LEXERを定義するとき、それらはすべてこの問題を抱えています:
入力に対してそれらを実行すると"leto"
、生成され[LET_KEYWORD,IDENTIFIER(o)]
ます。
これらのライブラリのいくつかは、次のような動作をすることを期待しています:
入力が の場合"let"
、最初に定義されたルールがより関連性が高いため、それを選択することであいまいさを解決します。入力が"leto"
存在する場合、あいまいさはなく、 のみが生成されIDENTIFIER(leto)
ます。それはここで説明されている動作です、ANTLR
automata - s-grammar (単純な文法) を見つける
次の言語の簡単な文法 (別名 S 文法) を見つけてください。
L={(ab) 2m b :m>=0}
【やったけどダメだった】
S-> aASBB|b
A->
B->b