【发布时间】:2016-05-13 03:37:01
【问题描述】:
我目前正在为具有全局变量和嵌套子例程功能的语言构建编译器。以前,我只为只有局部变量而没有嵌套子例程的语言构建了一个编译器。
我在代码生成阶段如何重用在语义分析阶段填充的符号表有一个问题。我将符号表作为一个链表堆栈,其中每个链表代表在特定范围内声明的标识符。每次进入范围时,都会创建一个新列表并将其推送到堆栈并成为当前范围。同样,每次离开作用域时,堆栈顶部的列表都会弹出。最后,语义分析完成后,我实际上有一个空的符号表,就像它开始时一样。但是,代码生成器需要一个完全填充的符号表才能正确生成代码。如何在不重新执行语义分析期间完成的操作(即在符号表中输入标识符)的情况下做到这一点?
【问题讨论】:
-
您是否考虑过将符号表构建为树而不是堆栈,所以最后会有一整棵范围树?
-
你的意思是让它遵循 AST 层次结构吗?我认为最好让各自的范围数据成为 AST 节点的一部分,就像接受的答案一样,这就是为什么我在进入/退出范围时不需要遍历两次
-
不,范围遵循自己的层次结构。您出于多种原因保留所有变量及其所属的范围,包括符号列表和调试器。 AST 仍应指向解析中使用的符号。
-
您可以在符号表中添加另一个称为嵌套级别的字段,以实现嵌套过程。
标签: compiler-construction code-generation code-reuse semantic-analysis symbol-table