antlr-blockly icon indicating copy to clipboard operation
antlr-blockly copied to clipboard

如何理解乘法优先?

Open SmireG opened this issue 2 years ago • 3 comments

expr: expr ('*'|'/') expr | expr ('+'|'-') expr | '(' expr ')' | Int | ID ; 这句里乘法优先。为什么图片里优先匹配了加法呢?按我的理解先匹配乘法应该是expr * 2,然后expr被解析为a+b,就变成了先算a+b再算乘2了

SmireG avatar Apr 07 '23 05:04 SmireG

是说文档里的这个图片吗?
https://zhaouv.github.io/antlr-blockly/docs/img/expr_parse_tree.png
pic
解析之后乘法在树的更深的位置, 是被优先执行的啊. b2处理之后回到了和a同样的深度后才能处理a加b2的结果

zhaouv avatar Apr 07 '23 14:04 zhaouv

我的疑问点在,规则说明乘除法匹配优先于加减法,那么为什么不是先匹配到expr * expr呢?

      expr  
       /|\
      expr * expr
       /|\
    expr + expr

我不太清楚antlr怎么做到将乘法放在更深的地方,这看上去乘法的优先级最低,才可以最后匹配他

SmireG avatar Apr 07 '23 14:04 SmireG

这里的优先是指类似数学运算里的算符结合性的优先, 并不是算法中使用这个匹配的优先度. 由于我们需要同一层中(同一个括号中)乘法被最先算术. 所以从树的角度看, 越晚被匹配, 在树中深度越深, 实际算术执行的时候越优先.

也可以说是使用这个匹配的优先度的优先度吧, 先使用了, 使用后的作为一个整体了再继续参与匹配, 就会作为叶子, 最后看在树中的位置的话, 就会更靠下

zhaouv avatar Apr 07 '23 14:04 zhaouv