Pratt-Parse的理解

这一小节要处理的问题是运算的优先级问题
这里先得出一个显然但是对后面理解很重要的结论:
在构建出来的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

×

喜欢就点赞,疼爱就打赏