【发布时间】:2016-05-30 22:44:11
【问题描述】:
我目前正在阅读关于编译器构造的book。在第 4 章中花了很多篇幅讨论属性语法,这让我很困惑。
我们为什么需要它?它在生产编译器中是如何使用的?
在我看来,属性语法是用来将解析树装饰成抽象语法树的。但是为什么我们不能在解析阶段构建 AST?
例如,在 OCaml 中,我可以这样描述 AST:
type ast =
| Var of string
| Num of int
| If of test * then * else
...
...
要构建一个 if 节点,我可以简单地做 If (test, then, else)
【问题讨论】:
-
在编译器中必须使用属性语法和/或 AST 确实不是硬性要求。这只是一种常见的做事方式。
-
关于您的问题“为什么我们不能在解析阶段构建 ST?” .在解析过程中,我们构建了 AST 并将其传递给语义分析器。语义分析器向 AST 的节点添加了一些更多信息(例如它的类型、值等),这些信息在语法阶段无法添加。
标签: parsing compiler-construction semantics