私は ANTLR4 を学んでいて、ある時点で混乱しています。Java に似た言語の場合、次のようなメンバー チェーンなどの構成要素のルールを追加しようとしています。
expr1.MethodCall(expr2).MethodCall(expr3);
2 つのルールが相互に左再帰的であるというエラーが表示されます。
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| memberAccess
;
memberAccess: expression DOT (methodCall | fieldReference);
上記のルールの組み合わせが左再帰と見なされる理由memberAccess
が理解できたと思います。expression
memberAccess
expression
ただし、( Java の例を見て) の内容を に移動するだけでmemberAccess
、 ANTLR4 からエラーが発生しないことを確認したとき、私の理解は崩壊しましたexpression
(それでも、必要なものを解析していないにもかかわらず、に陥るようです)ループ):
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| expression DOT (methodCall | fieldReference)
;
- 最初の例は左再帰ですが、2 番目の例はそうではないのはなぜですか?
- そして、最初の行を実際に解析するにはどうすればよいですか?