为什么终端可以有合成属性而不能有继承属性?

Why can terminals have synthesized attributes but not inherited attributes?

在 Aho 等人的编译器:原理、技术和工具第 305 页上,它说 "Terminals can have synthesized attributes, but not inherited attributes." 这是我的挂断:如果合成属性是可以根据节点的 children 计算的属性,并且可以根据节点的 parent 和兄弟节点计算继承的属性,这对我来说感觉不对,因为终端将是解析树的叶子,因此它们不会有任何 children。如果他们没有任何 children 那么他们就不应该有综合属性。类似地,似乎因为它们是叶子,所以它们很可能会有 parent 个节点,因此可能具有继承的属性。如果有人能指出我哪里出错了那就太好了。

初看龙书的时候,我也是一头雾水。但如果你稍微想一想,它就会变得清晰。终端综合属性不是来自解析器;相反,它们来自词法分析器。举个例子,假设你有一个终端digit(例子取自龙书)。 digit 具有合成属性 lexval。这个综合属性不是来自解析器。它来自词法分析器。应该很清楚为什么终端不能有继承属性:)

大多数 SDD(以及 SDTS)计算都是关于非终端的属性,这在 Dragon book 的前一页中明确指定。我们可以认为Terminals的属性是由scanner和其他编译阶段维护的符号table合成的