我目前正在阅读 book关于编译器构造。第4章花了很多篇幅讨论属性语法,这让我很困惑。
为什么我们需要它?它是如何在生产编译器中使用的?
在我看来,属性语法是用来将解析树装饰成抽象语法树的。但为什么我们不能在解析阶段构建 AST?
例如,在 OCaml 中,我可以这样描述 AST:
type ast =
| Var of string
| Num of int
| If of test * then * else
...
...
要构建 if 节点,我只需执行 If (test, then, else)
最佳答案
如果您编写了许多不同的编译器,您可能会厌倦一遍又一遍地复制相同类型的代码。像属性语法这样的东西通过将一些明显的东西移到语法定义中来减少样板代码的数量。
您可以对像 yacc 这样的系统提出同样的问题——为什么不直接编写代码来进行解析?答案是,在编写了一些编译器之后,您就会厌倦它并开始需要一些更高级别的帮助。
另一个优点是(如果系统正确实现),您可以避免在样板代码中出错的机会。
关于parsing - 为什么语义分析中需要属性语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35487028/