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