4

我正在开发一个小型的基于对象的编程语言。关于编译器符号表的简单问题

虽然我有点迷失在一件简单的事情上。我已经实现了几个访问者,他们收集AST的类名,类型和参数,方法头和字段。

我的问题是现在要做什么与我的方法的身体。我应该将本地变量添加到符号表吗?

它可能看起来像在第一个不错的主意,直到一个人认为,如情况:

void myMethod() { 
    int i; 

    while (something) { 
     int y; 
    } 

    while (something) { 
     int y; 
    } 
} 

是我刚刚到iy变量添加到符号表,我会得到y是一个重复的变量。

请记住,我了解符号表范围。我无法理解的是,在方法中是否应该在符号表上随时添加和删除信息,或者如果我在访问方法时将数据永久添加到符号表中(就像我对类+字段+ methodsheader)。

重申问题:访问方法体时,我应该在访问结束时让符号表与访问前一样吗?

谢谢!

+0

如果您仍然感兴趣并且没有一个好的解决方案,您可以将问题提交给全新的[cs.SE](http://cs.stackexchange.com)! – Raphael 2012-03-23 23:21:05

回答

0

为什么不建模程序块,这样你就可以让一个块拥有一个符号表。在这种情况下,y可能存在于两个不同的块中,因为这两个实例将被放置在两个不同的符号表中。

0

您有一个代表程序结构的AST。 AST中的某些节点代表新的作用域(方法条目,块体......)。

你可以建立一个符号表,它的形状与你的AST相同:无论你有一个代表一个范围介绍的AST节点,从符号到它们的声明建立一个相关的映射。

您必须按照您的语言语义确定的顺序搜索范围,但至少您会知道在哪里查找每个范围。