我正在学习 ANTLR4,我一度感到困惑。对于类似 Java 的语言,我正在尝试为成员链等结构添加规则,如下所示:
expr1.MethodCall(expr2).MethodCall(expr3);
我收到一个错误,说我的两个规则是相互左递归的:
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| memberAccess
;
memberAccess: expression DOT (methodCall | fieldReference);
我想我明白为什么上述规则组合被认为是左递归的:因为memberAccess
是的候选者expression
并且memberAccess
以expression
.
但是,当我看到(通过查看Java 示例)如果我只是将 to 的内容移动memberAccess
到expression
ANTLR4 时,我的理解就崩溃了(即使它仍然没有解析我想要的内容,似乎陷入了一个循环):
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| expression DOT (methodCall | fieldReference)
;
- 为什么第一个例子是左递归的,而第二个不是?
- 我该怎么做才能真正解析初始行?