v8::internal::Parser中的Expression解析

来源:互联网 发布:淘宝达人认证大v 编辑:程序博客网 时间:2024/05/27 03:29


首先需要参考Ecma-262文档中的附录A.3Expression中的产生式,v8中的代码是据此进行语法分析的,它采用的算符优先的语法分析方法,在token.h中给出了各种算符的precedence,关于算符优先算法,wiki中给出如下的伪代码

http://en.wikipedia.org/wiki/Operator-precedence_parser

parse_expression ()

    return parse_expression_1 (parse_primary(), 0)

parse_expression_1 (lhs, min_precedence)

    while the next token is a binary operatorwhose precedence is >= min_precedence

        op := next token

        rhs := parse_primary ()

        while the next token is a binaryoperator whose precedence is greater

                 than op's, or aright-associative operator

                 whose precedence is equal toop's

            lookahead := next token

            rhs := parse_expression_1 (rhs, lookahead'sprecedence)//这里递归,当前token指向rhs,lookahead下一个token的优先级以后才能确定是否递归,所以在进入递归后,一定能保证第一个循环时nexttoken的优先级大于等于参数指定的优先级

        lhs := the result of applying op withoperands lhs and rhs

return lhs

这里需要介绍两个术语lhs(left hand side),rhs(right hand side),分别表示左操作数和右操作数。该算法简而言之,就是比较算符的优先级,如果后出现的算符的优先级更高,那么就继续递归,否则就计算结果,并把结果作为左操作数继续循环。

该算法在Parser::ParseBinaryExpression函数(定义于parser.cc)中得到了充分的体现,该函数主要用于二元表达式和条件表达式的分析,其中递归调用了ParseBinaryExpression函数,且传入的precedence在当前操作符基础上加一,这是因为这里的二元操作符都是左结合的,在相同优先级情况下,左边的操作符的优先级要高
原创粉丝点击