Antlr 计算器语法中的优先顺序

Antlr 计算器语法中的优先顺序,antlr,antlr4,Antlr,Antlr4,我开始学习ANTLR,目前正在阅读“最终ANTLR4”参考资料,我想知道为什么在计算器示例中优先顺序起作用?使用的语法是: grammar LabeledExpr; prog: stat+ ; stat: expr NEWLINE # printExpr | ID '=' expr NEWLINE # assign | NEWLINE # blank | CLE

我开始学习ANTLR,目前正在阅读“最终ANTLR4”参考资料,我想知道为什么在计算器示例中优先顺序起作用?使用的语法是:

grammar LabeledExpr; 

prog:   stat+ ;

stat:   expr NEWLINE                # printExpr
    |   ID '=' expr NEWLINE         # assign
    |   NEWLINE                     # blank
    |   CLEAR                       # clearMemory
    ;

expr:   expr op=('*'|'/') expr      # MulDiv
    |   expr op=('+'|'-') expr      # AddSub
    |   INT                         # int
    |   ID                          # id
    |   '(' expr ')'                # parens
    ;

CLEAR: 'clear';

MUL :   '*' ; // assigns token name to '*' used above in grammar
DIV :   '/' ;

ADD :   '+' ;
SUB :   '-' ;

ID  :   [a-zA-Z]+ ;      // match identifiers
INT :   [0-9]+ ;         // match integers
NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)
WS  :   [ \t]+ -> skip ; // toss out whitespace
2+2*2生成此树,6


为什么不先计算加法呢?我的意思是,这是正确的,我只是不知道为什么。

好吧,我想我得到了答案(我花了这么多时间才把这个问题贴在了SO上)

如果我没有弄错的话,那是因为在解析器中,乘法和除法是第一条规则

expr:   expr op=('*'|'/') expr      # MulDiv
    |   expr op=('+'|'-') expr      # AddSub

正确,如果将
AddSub
放在
MulDiv
之前,
+
-
将优先于
*
/
8?“你是说6个,对吗?”巴特基尔斯道。当然6(会修好的)。我试图让它产生8,这是我的想法。