Antlr4 如何使用左递归和贪婪的';选择解析器规则优先级';操作人员

Antlr4 如何使用左递归和贪婪的';选择解析器规则优先级';操作人员,antlr4,Antlr4,举一个(几乎)教科书上的例子,我们期望乘法优先于加法,但也包括一个可选的匹配部分 expr : expr '*' expr ('ALSO')? | expr '+' expr | INT ; INT: [0-9]+; WS : [ \t\r\n]+ -> skip ; 使用3*4+2尝试语法时,我们得到一个意外的树 expr:1 / | \ expr:1

举一个(几乎)教科书上的例子,我们期望乘法优先于加法,但也包括一个可选的匹配部分

expr : expr '*' expr  ('ALSO')?
     | expr '+' expr
     | INT
     ;

INT: [0-9]+;

WS : [ \t\r\n]+ -> skip ;
使用
3*4+2
尝试语法时,我们得到一个意外的树

                  expr:1
               /    |   \
            expr:1  *   expr:2
              |         /  |  \
              3    expr:1  +  expr:1
                     |           |
                     4           2
然而,当使用
3+4*2
时,我们得到了我可能期望的结果

                  expr:1
               /    |   \
            expr:1  +   expr:2
              |         /  |  \
              3    expr:1  *  expr:1
                     |           |
                     4           2
另外,如果您将可选令牌切换到第二行,我们每次都会得到预期的树

expr : expr '*' expr
     | expr '+' expr ('ALSO')?
     | INT
     ;
我还尝试使用非贪婪操作符
,并定义lexer标记,这样我们就不必担心由于隐式标记而导致的排序异常


如何解释这种排序?

这看起来像一个bug。你可以在这里报告:(如果还没有报告……我没有检查)

似乎一种解决方法是包括一个不包含
标记的额外备选方案:

expr : expr '*' expr 'ALSO'
     | expr '*' expr
     | expr '+' expr
     | INT
     ;

这为
3*4+2
3+4*2

巴特生成了预期的解析树,我在黄金
解析
徽章持有者中爬行-你能看一下吗?对于阅读本问答的读者,这里报道了这个问题: