什么遍历树会给我正确的结果

时间:2012-03-22 20:46:05

标签: c parsing compiler-construction tree-traversal

我的编译器有一个解析树,我想知道我的解析树的遍历将给出与源代码测试生成相同的顺序,

我认为它应该是预订,但我被告知它是有序的,有人可以告诉我原因。

另外,如果我想在我的解析器中找到,那么标识符的声明是什么时候完成的,(比如说非终结declaration有生成),而不是我选择的遍历顺序。预购?

3 个答案:

答案 0 :(得分:1)

要弄清楚,你解析类似的东西:

 x = a + b

预购单是:

(=, (+, a, b))

并且顺序是

(x, =, (a, +, b))

正确?

我不确定你的意思是什么"我的源代码测试代码的顺序与#34;,但我真的猜你要求你的表达顺序。

答案 1 :(得分:0)

您想要进行有序遍历。如果你在this AST上进行有序遍历,那么你将按照它们在源代码中编写的顺序访问构造。

  

另外,如果我想在我的解析器中找到它,那么什么时候   标识符声明已经完成,(例如非终结声明已经完成)   那个生产)比我选择的遍历顺序。   预购?

这里不太清楚你的意思,但如果你指的是找到声明符号的位置(行,字符或列号),那么该信息应该与标识符AST节点一起存储它被插入树中。大多数解析器在匹配某些令牌时跟踪该信息。

但是,将位置信息与符号表条目一起存储会更有效,而不是在需要时遍历树。

答案 2 :(得分:0)

如果你有继承属性,那么你可能需要顺序遍历。

假设您要解析

int a;

此声明的制作规则是

声明 - >输入id;
类型 - > int |漂浮;

所以你看,你需要将Type(int或float)传递给id(在这种情况下是a)。这种信息传递可以通过inorder遍历来完成。