Antlr4 删除间接左递归(我不理解形式符号)

Antlr4 删除间接左递归(我不理解形式符号),antlr4,context-free-grammar,left-recursion,Antlr4,Context Free Grammar,Left Recursion,我试着寻找我的解决方案的答案,但我似乎无法将我的头脑集中在广义的解决方案上。我无法找出哪些元素对应于大写字母,哪些元素应该用小写字母表示,这对我没有帮助 这是我的Antlr语法的一部分: expression : literal | unaryExpression | binaryExpression | priorityExpression | invocation ; binaryExpression: expression binaryOp

我试着寻找我的解决方案的答案,但我似乎无法将我的头脑集中在广义的解决方案上。我无法找出哪些元素对应于大写字母,哪些元素应该用小写字母表示,这对我没有帮助

这是我的Antlr语法的一部分:

expression
    : literal
    | unaryExpression
    | binaryExpression
    | priorityExpression
    | invocation
    ;

binaryExpression: expression binaryOperator expression;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;

如何删除
binaryExpression
中的递归

只需删除
二进制表达式
并直接在
表达式
中使用
表达式二进制运算符表达式

expression
    : literal
    | unaryExpression
    | expression binaryOperator expression
    | priorityExpression
    | invocation
    ;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;
编辑 但是现在我在AST中丢失了二进制表达式节点,我必须在以后的代码中检测它

然后使用:

此外,我还想更好地理解如何删除此递归,而不是将其卸载到Antlr


你不能。ANTLR根本不允许这种间接的左递归规则。只有直接左递归。

是的,但是现在我在AST中丢失了二进制表达式节点,我必须在以后的代码中检测它,有效地延迟了这部分解析。此外,我还想更好地理解如何删除此递归,而不是将其卸载到Antlr@MackThax检查我的编辑除了Bart的解决方案之外,这里还有一个我的anwser,我在其中描述了一个。
expression
    : literal                              #literalExpr
    | unaryExpression                      #unaryExpr
    | expression binaryOperator expression #binaryExpr
    | priorityExpression                   #priorityExpr
    | invocation                           #invocationExpr
    ;

binaryOperator
    : ADD
    | SUBTRACT
    | DIVIDE
    | CONCAT
    | EQUALS
    | NOT_EQUALS
    | LESS_THAN
    | GREATER_THAN
    | MULTIPLY
    ;