为什么我们在语义分析中需要属性文法?

why do we need attribute grammar in semantic analysis?

我目前正在阅读 book 关于编译器构造的文章。在第 4 章中,它花了很多 space 来谈论属性语法,这让我很困惑。

我们为什么需要它?以及如何在生产编译器中使用它?

在我看来,属性语法是用来将解析树修饰成抽象语法树的。但是为什么我们不能在解析阶段构建 AST?

例如,在OCaml中,我可以这样描述AST:

type ast =
  | Var of string
  | Num of int
  | If of test * then * else
  ...
  ...

要构建一个 if 节点,我可以简单地做 If (test, then, else)

如果您编写了很多不同的编译器,您可能会厌倦一遍又一遍地复制相同类型的代码。属性语法之类的东西通过将一些明显的东西移到语法定义中来减少样板代码的数量。

您可以对像 yacc 这样的系统提出同样的问题——为什么不直接编写代码来进行解析呢?答案是,在编写了一些编译器之后,您会厌倦它并开始需要一些更高级别的帮助。

另一个优点是(如果系统实施正确),您可以避免在样板代码中出错的机会。