解释器后端,你如何遍历抽象语法树?

时间:2013-12-10 17:59:46

标签: compiler-construction interpreter abstract-syntax-tree

我正在编写一个解释器,并且没有找到一个很好的解释,说明如何在语义分析后遍历和抽象语法树。我想知道正确的做法是什么。我知道你将终端合并到他们的父母从左到右处理,并尽可能多地重复这个。

我有这个抽象的语法树,可能是也可能不正确。

ast http://theadesilva.com/so_1.jpg

我该怎么办?

将34和3合并为*,然后将4和*合并为+,然后将ident合并到call和+ into call中?是对的吗?像这样向后遍历树的好算法是什么?

1 个答案:

答案 0 :(得分:1)

我不会像你那样构建AST。我会将print视为具有一个参数的函数。所以我会将树构建为

print
     \
      +
    /   \
   4     *
       /   \
      3     34

在将根目录中的运算符/函数应用于子项之前,您可以遍历树并评估子项。没有规则说你只能生两个孩子。如果你需要几个,你可以有几个孩子。

即。有趣的(A,B,C,d)

    fun
  / / \ \
 a b  c  d

或没有孩子

即。 currentTime的()

currentTime

所以对于我的AST的问题,它将是

visit                                               
print          need to evaluate right child  
+              left is 4, need to evaluate right  
*              left is 3, right is 34  
               evaluate 3 * 34 and return right = 102  
               evaluate 4 + 102 and return right = 106  
               evaluate print, so print 106