我正在开发一种基于对象的小型编程语言。
但是,我在一件简单的事情上有点失落。我已经实现了几个访问者来收集AST的类,方法标题和字段的名称,类型和参数。我的问题在于我现在用我的方法做什么。我应该将局部变量添加到符号表吗?
起初看起来好像是一个好主意,直到有人想到如下案例:
void myMethod() {
int i;
while (something) {
int y;
}
while (something) {
int y;
}
}
我只是将i
和y
变量添加到符号表中,我得到y
是一个重复的变量。
请记住我了解符号表范围。我无法理解的是,在方法内部是否应该在符号表上动态添加和删除信息,或者在访问方法时是否应该将数据永久地添加到符号表中(就像我使用类+字段+一样) methodsheader)。
重述问题:访问方法体时,我应该在访问结束时让符号表与访问前一样吗?
谢谢!
答案 0 :(得分:2)
你有一个表示程序结构的AST。 AST中的某些节点表示新的范围(方法条目,块体,......)。
您可以构建一个与AST具有相同形状的符号表:无论您有一个代表范围介绍的AST节点,还要构建从符号到其声明的关联映射。
您必须按照语言语义确定的顺序搜索范围,但至少您会知道在哪里查找每个范围。
答案 1 :(得分:1)
为什么不对程序块进行建模,这样就可以让一个块拥有一个符号表。在那种情况下,y
可以在两个不同的块中存活,因为这两个实例将被放置在两个不同的符号表中。