私は文法を持っていますFoo.xtext
(ここに含めるには複雑すぎます)。Xtextはそれから生成さInternalFoo.g
れます。 いくつかの調整の後、DebugInternalFoo.g
アクションなしで同じものであると主張するものも生成されます。今、私はANTLRでアクションを直接取り除きます
java -cp antlr-3.4.jar org.antlr.tool.Strip Internal.g > Stripped.g
私がそれらをチェックするとき、私は3つの文法が同じように振る舞うことを期待します。しかし、これが私が経験したことです
InternalFoo.g
-エラー、ルールの割り当てにLL(*)以外の決定がありますDebugInternalFoo.g
-問題ありません、うまく解析しますStripped.g
-ルール割り当て時の警告。複数の選択肢を使用して決定を一致させることができます。正しく解析できません。
文法がアクションの有無にかかわらずテキストを異なる方法で解析する可能性はありますか?それとも、アクションリムーバーツールのバグですか?(問題のルールには構文述語があり、それらがないと、実際にはLL(*)以外の決定が行われます。)
アップデート:
問題の原因を部分的に見つけました。問題のルールはこんな感じでした
trickyRule:
({ some complex action})
(expression '=')=>...
Antlrでストリッピングするとアクションが削除されましたが、空のグループが残りました。
// Stripped.g
trickyRule:
() (expression '=')=>...
デバッグ文法を生成すると、アクションとその周囲の空のグループの両方が削除されます。
// DebugInternalFoo.g
trickyRule:
(expression '=')=>...
したがって、学んだ教訓は次のとおりです。構文述語の前の空のグループは、まったく同じではありません。