关于编译器符号表的简单问题

时间:2011-05-02 19:32:03

标签: computer-science visitor-pattern compiler-construction

我正在开发一种基于对象的小型编程语言。

但是,我在一件简单的事情上有点失落。我已经实现了几个访问者来收集AST的类,方法标题和字段的名称,类型和参数。

我的问题在于我现在用我的方法做什么。我应该将局部变量添加到符号表吗?

起初看起来好像是一个好主意,直​​到有人想到如下案例:

void myMethod() {
    int i;

    while (something) {
        int y;
    }

    while (something) {
        int y;
    }   
}

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

你有一个表示程序结构的AST。 AST中的某些节点表示新的范围(方法条目,块体,......)。

您可以构建一个与AST具有相同形状的符号表:无论您有一个代表范围介绍的AST节点,还要构建从符号到其声明的关联映射。

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

答案 1 :(得分:1)

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