0

私は ANTLR4 を学んでいて、ある時点で混乱しています。Java に似た言語の場合、次のようなメンバー チェーンなどの構成要素のルールを追加しようとしています。

expr1.MethodCall(expr2).MethodCall(expr3);

2 つのルールが相互に左再帰的であるというエラーが表示されます。

expression
    : literal
    | variableReference
    | LPAREN expression RPAREN
    | statementExpression
    | memberAccess
    ;

memberAccess: expression DOT (methodCall | fieldReference);

上記のルールの組み合わせが左再帰と見なされる理由memberAccessが理解できたと思います。expressionmemberAccessexpression

ただし、( Java の例を見て) の内容を に移動するだけでmemberAccess、 ANTLR4 からエラーが発生しないことを確認したとき、私の理解は崩壊しましたexpression(それでも、必要なものを解析していないにもかかわらず、に陥るようです)ループ):

expression
    : literal
    | variableReference
    | LPAREN expression RPAREN
    | statementExpression
    | expression DOT (methodCall | fieldReference)
    ;
  1. 最初の例は左再帰ですが、2 番目の例はそうではないのはなぜですか?
  2. そして、最初の行を実際に解析するにはどうすればよいですか?
4

2 に答える 2

0

なんらかの理由で、文法に左再帰があると ANTLRWorks 2 が応答せず、文法が間違っていると (誤って) 思い込んでしまいました。

コマンドラインからのコンパイルとテストにより、即時の左再帰を含むバージョンが実際に正しくコンパイルおよび解析されたことが明らかになりました。

(他の誰かが IDE の動作に混乱した場合に備えて、ここに残しておきます。)

于 2015-04-03T15:21:27.287 に答える