Computer science 关于编译器的简单问题';s符号表

Computer science 关于编译器的简单问题';s符号表,computer-science,visitor-pattern,compiler-construction,Computer Science,Visitor Pattern,Compiler Construction,我正在开发一种小型的基于对象的编程语言 不过,我对一件简单的事情有点迷茫。我已经实现了几个访问者,它们从AST中收集类、方法头和字段的名称、类型和参数 我的问题是现在如何处理我的方法体。我应该将局部变量添加到符号表中吗 一开始这可能看起来是个不错的主意,直到有人想到这样一个案例: void myMethod() { int i; while (something) { int y; } while (something) { i

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

不过,我对一件简单的事情有点迷茫。我已经实现了几个访问者,它们从AST中收集类、方法头和字段的名称、类型和参数

我的问题是现在如何处理我的方法体。我应该将局部变量添加到符号表中吗

一开始这可能看起来是个不错的主意,直到有人想到这样一个案例:

void myMethod() {
    int i;

    while (something) {
        int y;
    }

    while (something) {
        int y;
    }   
}
如果我只是将
I
y
变量添加到符号表中,我会得到
y
是一个重复的变量

请记住,我知道符号表范围。我无法理解的是,在方法内部是否应该在符号表中动态添加和删除信息,或者在访问方法时是否应该将数据永久添加到符号表中(就像我在类+字段+方法引线中所做的那样)

重申这个问题:当访问一个方法主体时,我是否应该在访问结束时让符号表与访问之前一样


谢谢

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

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

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


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

如果您仍然感兴趣,并且没有好的解决方案,您可能希望将问题带到全新的位置!