为啥我们在语义分析中需要属性语法?

Posted

技术标签:

【中文标题】为啥我们在语义分析中需要属性语法?【英文标题】:why do we need attribute grammar in semantic analysis?为什么我们在语义分析中需要属性语法? 【发布时间】: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 的节点添加了一些更多信息(例如它的类型、值等),这些信息在语法阶段无法添加。 【参考方案1】:

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

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

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

【讨论】:

网上有没有使用属性语法的简单编译器?我正在阅读的这本书包含很多理论,我认为一些示例代码可能会对我有所帮助。 您可以尝试在本书的配套站点上查看代码示例:booksite.elsevier.com/9780124104099 据说它们已扩展为完全可运行的程序。我不知道任何使用属性语法的特定编译器——对不起。

以上是关于为啥我们在语义分析中需要属性语法?的主要内容,如果未能解决你的问题,请参考以下文章

语法分析和语义分析

编译原理系列 实验四语义分析与中间代码生成

编译原理系列 实验四语义分析与中间代码生成

编译原理复习总结-耗子尾汁

编译原理复习总结-耗子尾汁

PostgreSQL---语义分析