抽象语法树实现

时间:2011-03-09 11:31:21

标签: compiler-construction

我正在研究mini c#的编译器。符号表已完成,我所知道的下一阶段我必须构建一个抽象语法树。 所以我的问题是: 1.当我已经有一个符号表可以容纳比语法树更多的信息时,为什么我需要一个抽象语法树。 2. AST节点应该具有哪些属性?  最后,如果有人知道我可以使用的书或任何参考,请告诉我。

1 个答案:

答案 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