【问题标题】:Writing a compiler: will symbol table still be used after semantic analysis (type-checking)编写编译器:语义分析(类型检查)后是否仍使用符号表
【发布时间】:2016-06-28 18:00:26
【问题描述】:

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

在第5章,语义分析中,它使用函数数据结构来构建符号稳定。所以insert table key value会返回一个新表,而不是修改已有的表,函数返回时保留旧表。所以当类型检查完成后,符号表还是空的。

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

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

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

【问题讨论】:

  • 在代码生成过程中当然会用到符号表:a *= 5 应该生成浮点乘法的整数吗?
  • @MargaretBloom 可以肯定地说我应该对符号表使用命令式数据结构吗?哈希表而不是 bst

标签: compiler-construction


【解决方案1】:

没有。您可能希望它用于代码生成、错误/反馈报告和链接。

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

  a+b

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

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

最后,你可能会有单独编译的系统。如果是这种情况,单独编译的元素之间的链接通常是通过使用由编译器从程序导出到链接器的名称来完成的。如果 foo 是在另一个编译单元中定义的,你很难将调用链接到“foo”,除非编译器和链接器同意将链接命名为“foo”。

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

【讨论】:

  • 我真的很困惑。当类型检查器从范围返回时,该范围不是从符号表中删除了吗?完成类型检查后,符号表如何仍然保存有关内部范围的信息?本书的语义分析练习是写一个类型检查器trans_prog: ast -> unit,这意味着函数什么都不返回,本书在本章开头谈到了函数符号表,因为我使用了OCaml
  • 如果您坚持遵循一种非常古老的符号表构造方式,其中作用域完全嵌套,您将了解编译器如何将新符号表推入堆栈时“进入”一个词法范围的区域,并在离开该区域时弹出(销毁)它。如果您同意我的论点,那么您无论如何都不想破坏它。 ...
  • ... 如果您查看现代语言(尤其是那些具有各种名称空间的语言),您会发现范围到代码的映射不一定很好地嵌套在嵌套语法方面语言。现在你需要有符号表,其范围取决于正在处理的源文本的哪一部分以及各种有趣的语言规则(你应该看到 C++!),它们显然不是(完全)词法范围。所以你无论如何都不想推新/流行旧符号表。
  • 最好使用符号映射将名称与特定上下文中的类型相关联,并且查找范围的规则仅取决于正在处理的程序部分。范围仍然意味着,“在某个点(nee周边区域)可以看到哪些符号”;这可能意味着按复杂顺序询问的符号图集。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多