parsing - 为什么语义分析中需要属性语法?

标签 parsing compiler-construction semantics

我目前正在阅读 book关于编译器构造。第4章花了很多篇幅讨论属性语法,这让我很困惑。

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

enter image description here

在我看来,属性语法是用来将解析树装饰成抽象语法树的。但为什么我们不能在解析阶段构建 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/

相关文章:

perl - 在 Perl 中,如何正确解析带引号的字符串的制表符/空格分隔文件?

c# - 有没有手机的编译器模拟器?

c++强制编译器选择退出某些代码

java - 为什么一个类的实例可以访问它自己类型的另一个实例的私有(private)字段?

c - 当 y 为 0 时,模运算符 x % y 的语义是什么?

c# - 如何在 C# 中解析三元语句

python - 使用 Django 和 csv.DictReader 解析 CSV

C 文件 I/O 问题

python - 为什么 (python|ruby) 被解释?

xhtml - 订购您的标题标签