2012-03-22 66 views
0

我有一个解析树为我的编译器,我想知道什么遍历我的解析树会给我相同的顺序,我的源代码被测试的代,什么遍历树会给我正确的结果

我认为这应该是预购,但我被告知它是有序的,有人可以告诉我为什么。另外,如果我想知道在我的解析器中,什么时候完成了一些标识符的声明(比如说非终结符号declaration已经为此生成了),那么我的选择顺序是什么样的。预购?

+0

请翻译“我的源代码测试代码的相同顺序”。 – EJP 2012-03-22 21:39:57

回答

0

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

另外,如果我想找出我的解析器,当时正值标识符的一些 声明做,(说非终结声明有 生产为)比我该选择什么遍历的顺序。 预购?

不太确定这里是什么意思,但是如果您指的是查找声明符号的位置(行,字符或列号),那么应该使用标识符存储该信息AST节点插入树中时。大多数解析器在匹配某个令牌时会跟踪该信息。

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

1

得到明确,你分析是这样的:

x = a + b 

的序是:

(=, (+, a, b)) 

和序是

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

吧?

我不确定你的意思是“与我的源代码测试代代相同的顺序”,但我真的猜测你要求提供你的表达式。

0

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

假设你想分析

int a;

,为此申报生产规则是

Statment - >输入ID;
类型 - > int |漂浮所以你看,你需要将Type(int或float)传递给id(在这种情况下,a)。这个信息传递可以通过遍历来完成。