我正在编写一个解释器,并且没有找到一个很好的解释,说明如何在语义分析后遍历和抽象语法树。我想知道正确的做法是什么。我知道你将终端合并到他们的父母从左到右处理,并尽可能多地重复这个。
我有这个抽象的语法树,可能是也可能不正确。
ast http://theadesilva.com/so_1.jpg
我该怎么办?
将34和3合并为*,然后将4和*合并为+,然后将ident合并到call和+ into call中?是对的吗?像这样向后遍历树的好算法是什么?
答案 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