我正在研究mini c#的编译器。符号表已完成,我所知道的下一阶段我必须构建一个抽象语法树。 所以我的问题是: 1.当我已经有一个符号表可以容纳比语法树更多的信息时,为什么我需要一个抽象语法树。 2. AST节点应该具有哪些属性? 最后,如果有人知道我可以使用的书或任何参考,请告诉我。
答案 0 :(得分:1)
1) 那么,符号表(ST)只能保存关于符号的静态信息。但是要收集这些信息,必须要理解符号在表达式或命令中的语法位置。
因此,例如,如果您的词法分析器告诉您它找到了“类型”令牌,那么您的ST中没有任何关系。接下来它可以找到一个“标识符”。所以int i;
可以是命令。你需要在ST中加入一个整数变量。但是如果序列是int i();
,则需要将标识符i
定义为返回int的函数。
我很困惑你怎么能拥有没有AST的ST,因为这就是ST的实现方式。
2) 通常,AST不包含有关符号的信息。树中符号的位置是其最有价值的信息。所以,如果你看到类似的东西:
int main(void)
{
int i=0;
if(i==0)
{
int i=1;
printf("i=%d\n", i);
}
printf("i=%d\n", i);
}
因为AST中第二个i
的位置,在树下面,在“if”中,你可以告诉你的ST有2个i
,并且它们是不同的变量。事先你无法猜到的东西,直到你创造一个包含所有符号的树。
保重, 贝乔
PS。编辑: 我用过的最好的书:
编译器:原理,技术和& Gradiance工具(pkg)(第2版) 作者:Alfred V. Aho,Monica S. Lam,Ravi Sethi,Jeffrey D. Ullman 出版商:Addison Wesley; 2版(2007年10月15日) ISBN-10:0321547985 ISBN-13:978-0321547989