1

私は文法を持っています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 '=')=>...

したがって、学んだ教訓は次のとおりです。構文述語の前の空のグループは、まったく同じではありません。

4

1 に答える 1

0

文法がアクションの有無にかかわらずテキストを異なる方法で解析する可能性はありますか?

はい、それは可能です。org.antlr.tool.Strip構文述語1を残しますが、検証2-およびゲート3セマンティック述語(およびmemberこれらのセマンティック述語が使用する可能性のあるセクション)を削除します。

たとえば、次のルールは:にのみ一致しA_TOKENます。

parser_rule1
  :  (parser_rule2)=> parser_rule2
  ;

parser_rule2
  :  {input.LT(1).getType() == A_TOKEN}? .
  ;

ただし、そのStrip上でツールを使用すると、次のようになります。

parser_rule1
  :  (parser_rule2)=> parser_rule2
  ;

parser_rule2
  :  /*{input.LT(1).getType() == A_TOKEN}?*/ .
  ;

任意のトークンと一致させます。

つまり、Strip生成されたレクサーまたはパーサーの動作を変更する可能性があります。


1構文述語:( ... )=>
2検証セマンティック述語{ ... }?
3ゲートセマンティック述語{ ... }?=>

于 2011-12-09T08:18:54.067 に答える