我开始研究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
为什么不首先计算加法?我的意思是正确的,我只是不知道为什么。
答案 0 :(得分:2)
好吧,我想我得到了答案(花了我所有的时间在SO上发帖)。
如果我没记错的话,是因为在解析器中乘法和除法是第一个规则。
expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub