Rhino抽象语法树的遍历
Rhino是Mozilla提供的一款JavaScript解释引擎,Rhino生成的AST也有自己的格式。Rhino生成的抽象语法树中,所有的结点都以链表的形式链接共同构建该语法树,下述通过一个实例阐述语法树。
1 function test() 2 { 3 var a = 1; 4 var b = 2; 5 } 6 i = 2; 7 (function (a){console.log(a)})(1);

首先这棵AST的根为AstRoot结点,root的first域指向的结点便是AST树的第一个有效结点。在JavaScript代码中,所有处于同一作用域的代码,都处于同一深度,后边结点由前一结点的next域指向。
因此在Rhino的AST中,first域指向的该节点内部作用域中的第一个有效结点,而next域指向的是与该结点同级的结点,类似于孩子兄弟二叉树。因此在上述代码中,函数test和第六行的赋值表达式和第七行的匿名函数调用处于同一深度。如图1所示,这三个结点分别由next域连接,并且其parent都相同,均是AstRoot。
再来分析FunctionNode,FunctionNode仅包含描述了该函数的信息,其函数体的AST无法获取,FunctionNode的body域描述了该函数体,因此应该对FunctionNode的body进行继续遍历。Body的first域指向了该函数体第一条语句的结点,第一个结点得next域指向了第二条语句的结点,以此类推。
ExpressionStatement的expr域指向了该结点存储的表达式,如上上述第五行代码处,为一赋值语句,则该expr是一个Assignment类型的结点。该结点的left域为赋值的变量名,right域为值。

浙公网安备 33010602011771号