gpt4 book ai didi

compiler-construction - 如何在多 channel 编译器中正确重用符号表

转载 作者:行者123 更新时间:2023-12-05 03:44:21 25 4
gpt4 key购买 nike

我目前正在为 block 结构语言语言构建多 channel 编译器。我在语义分析阶段构建了一个范围堆栈。当进入一个新的范围时,创建一个新表,将其压入堆栈并使其成为当前范围表,然后将此范围内的所有交易品种插入到当前表中。当离开作用域时,当前表被记录在 AST 节点中,然后从作用域栈中弹出。

这样,在代码生成阶段,就不用重新构建符号表了。一旦进入新的作用域,它可以简单地从 AST 节点获取表,然后将其插入作用域堆栈。我认为这是大多数编译器教科书推荐的方式。

在大多数情况下,这工作得很好,但是,有一个极端情况我不知道如何正确处理。考虑以下代码示例:

int a = 1;
int b = 2;

void test()
{
int a = b;
int b = 3;
}

它有两个作用域:全局作用域和 test() 的作用域。因此,要为 test() 生成代码,我们必须:

  1. 将全局符号表压入作用域栈
  2. 从 AST 节点获取 test() 的符号表并将其推送到作用域堆栈

现在,当处理“int a = b;”时,它会从作用域堆栈中找到局部变量 b,这显然是不正确的,因为局部 b 尚未声明。

知道如何处理这个问题吗?是否必须在离开范围时销毁所有符号并在代码生成阶段重新构建符号表?

谢谢大家!

最佳答案

这个问题的一个解决方案是让标识符的 AST 节点包含指向创建时在符号表中找到的特定符号的链接。假设程序文本是从头到尾按顺序解析的,一次一条语句,这将给出正确的符号。这也消除了在符号表中重复查找的需要。

关于compiler-construction - 如何在多 channel 编译器中正确重用符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66489227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com