这一小节要处理的问题是运算的优先级问题
这里先得出一个显然但是对后面理解很重要的结论:
在构建出来的AST中每个节点的优先级一定是以自己为根的这这颗子树里最小的
上面这个结论比较显然,但是这是在目前还没有引入()的情况下是正确的
对2*3+4*5来说,下面这样的AST之所以不对就是因为顶端*的优先级大于了+
*
/ \
2 +
/ \
3 *
/ \
4 5
如果构建出这样的AST,那它就是对原表达的正确反映
在之前的处理当中,对expr的定义如下:
expression: number
| expression '*' expression
| expression '/' expression
| expression '+' expression
| expression '-' expression
;
number: T_INTLIT
;
如果修改expr定义如下:
expression: additive_expression
;
additive_expression:
multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
multiplicative_expression:
number
| number '*' multiplicative_expression
| number '/' multiplicative_expression
;
number: T_INTLIT
;
把expr分为了两大类,additive和multive,对于addtive来说它操作的最小单位是multive,而multive操作的最小单位是number,这就使得multive的expr掌握了对number的优先结合权,还是对2*3+4*5,现在它就会会被解析成multive_expr+multive_expr,也就是一个additive_expr,其实不管怎样到了最后整个expr一定是一个additive_expr,
参考文章:blog.huati365.com
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2128099421@qq.com