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