我想知道是否只有一个符号表存储一个源文件的所有信息,还是有多个符号表相互堆叠,只有在当前作用域与表相关时才会获取。假设我有两个方法 int b;
... int b;}
这里,a和b的作用域不相同,因此如果符号表被堆叠,则在执行foo时首先获取与foo相关的符号表。然而,在执行bar时,bar的符号表被堆叠在foo上,因此当前的<
输入新范围时,创建新表,将其推送到堆栈并使其成为当前作用域表,然后将此作用域内的所有符号插入当前表中。当离开作用域时,当前表记录在AST节点中,然后从范围堆栈中弹出它。这样,在代码生成阶段,就不必再次构建符号表了。一旦它进入一个新的作用域,它就可以简单地从AST节点获取表,然后将它推到范围堆栈中。我认为这是大多数编译器教科书推荐的方式。考虑以下代码示例:int b = 2;
{ int b = 3;它有两个<em