编写编译器:语义分析(类型检查)后符号 table 仍将被使用

Writing a compiler: will symbol table still be used after semantic analysis (type-checking)

我正在阅读 Modern Compiler Implementation In ML,并尝试做编译器项目(老虎语言)。

在第5章语义分析中,使用函数式数据结构构造符号stable。所以insert table key value会return一个新的table,而不是修改现有的table,并且在函数returns时保留旧的table .所以当类型检查完成后,符号 table 仍然是空的。

我的问题是,这是否意味着符号 table 纯粹用于类型检查? 因为我读过这个 SO ,它说符号 table 也将用于代码生成(我还没有走那么远)。

如果语义分析后要使用符号table,我应该使用命令式数据结构吗?

任何具体的例子将不胜感激。 :)

没有。您可能需要它来生成代码、error/feedback 报告和 linking。

类型检查只是验证程序是否明显异常。检查完成后,您现在可能想要生成中间代码。 Java 表达式

  a+b

可能会进行类型检查,但在生成代码时,a 和 b 的类型很重要。根据 a 和 b 分别是数字还是字符串甚至不同,您会得到不同的代码。

报告,可能是在代码生成和优化过程中,编译器对为什么不能做出某个期望的结果有意见。在这种情况下,它可能希望以用户的方式向用户传达意见;通常根据一些有助于意见的命名实体。为此,您需要保留从中间表示到符号 table.

中名称的联系

最后,你可能会有单独编译的系统。如果是这种情况,单独编译的元素之间的 linkages 通常是通过使用编译器从程序导出的名称来完成的,linker。如果 foo 是在另一个编译单元中定义的,你很难 link 调用 "foo",除非编译器和 linker 同意命名 linkage,好吧,"foo".

所以不,你不应该扔掉符号 table。