antlr - 计算器语法中的优先顺序
问题描述
我开始研究 ANTLR,目前正在通过“Definitive 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
推荐阅读
- javascript - 连续创建具有特定占位符的字段
- laravel - vue组件,prop声明并传递,但是控制台说prop丢失
- python - 如何使用python识别音频文件中的特定声音
- spring-boot - reactor.util.retry.Retry 中是否有任何功能可以在重试成功时使用
- angular - 带有对 3rd 方组件的模板引用的 Angular ContentChild
- c# - c# string.split 只工作几次
- javascript - 按钮没有图标
- javascript - 离开jQuery,写了一个简单的ajax函数,但是链式方法不会等待
- rust - 函数适用于推断的生命周期,但不适用于显式生命周期
- java - Java charAt() 返回随机整数而不是字母