Java 如何在ANTLR中处理左联想语法

Java 如何在ANTLR中处理左联想语法,java,parsing,antlr,context-free-grammar,Java,Parsing,Antlr,Context Free Grammar,我使用antlr生成生成抽象语法树的解析器。我有一些关于左联想运算符的问题。我的语法如下: add_expr returns [ASTNode value] :a=mul_expr {$value = a;} ( o = ('+' | '-') b = add_expr { $value = new AddNode(a, b, $o.text); } )? ; mul_expr returns [AS

我使用antlr生成生成抽象语法树的解析器。我有一些关于左联想运算符的问题。我的语法如下:

add_expr returns [ASTNode value]
    :a=mul_expr {$value = a;}
    (
        o = ('+' | '-') b = add_expr
        {
        $value = new AddNode(a, b, $o.text);
        }
    )?
    ;
mul_expr returns [ASTNode value]
    :a=term {$value = a;}
    (
        o = ('*' | '/') b = mul_expr
        {
        $value = new MultiplyNode(a, b, $o.text);
        }
    )?
    ;
AddNode和MultiplyNode的构造函数如下所示:

AddNote(ASTNode left, ASTNode right, String operatorr)

问题是,对于输入a-b-c,它被解析为类似于a-(b-c)的东西,而不是(a-b)-c。Antlr不接受左递归语法。如何修改语法以使左侧关联语法在表达式中像a-b-c一样工作?

解析
a-b-c
不是作为
a-(b-c)
而不是作为
(a-b)-c
,而是作为
a(-b)-c
,也就是说

additiveExpression 
:   multiplicativeExpression
    (   
        (   '+'
        |   '-'
        )
        multiplicativeExpression
     )*
;

以上规则摘自。保存文本并使用编辑器阅读,因为浏览器可能会忽略其中的行尾。

解析
a-b-c
不是作为
a-(b-c)
,也不是作为
(a-b)-c
,而是作为
a(-b)-c
,也就是说

additiveExpression 
:   multiplicativeExpression
    (   
        (   '+'
        |   '-'
        )
        multiplicativeExpression
     )*
;
以上规则摘自。保存文本并使用编辑器阅读,因为浏览器可能会忽略其中的行尾