一个属性可以同时合成和继承吗?

Can an attribute be synthesized and inherited at the same time?

我读到 synthesizedinherited 属性是不相交的集合。但是我很难从定义中推导出来,这表明我对这些定义缺乏理解。

假设我有一个产生式 S -> E + E。如果我按以下方式分配定义我的属性:

S -> E1 + E2

E1.side = left
E2.side = right

E1.position = 1
E2.position = E1.position + 2

那么E的side属性既没有使用父节点和兄弟节点的属性,也没有使用子节点的属性。那么它是inherited属性,还是synthesized?为什么?为什么它不适合其他类别?

另外 position 属性会有什么不同吗?

Knuth's original formulation(值得一读他的论文,可读性很强)中,合成属性应用于产生式左侧的非终结符,而继承属性应用于产生式右侧的符号(不一定是非终结符号)。定义属性的函数可以在产生式中使用任何其他符号的属性。

和往常一样,假设开始符号永远不会出现在产生式的右侧;这不是限制,因为很容易用定义新开始符号的产生式 S' -> S 扩展语法。有了这个假设,很明显开始符号没有继承属性(因为它从来没有出现在产生式的右边),而终端没有合成属性(因为它从来没有出现在产生式的左边)制作。)

另外,合成属性的公式只能使用产生式右边符号的属性,因为任何属性公式都不能使用正在计算属性的符号的属性。然而,这不是“综合属性”的定义(虽然它经常被表示为一个);相反,它是定义的结果。另一方面,继承属性计算可能会使用左侧符号的属性,但这不是必需的。它们可能是常量,就像您的情况一样,或者它们可能只使用其他右侧符号。

在所有情况下,属性都应该没有副作用;属性语法模型在不依赖于执行顺序(数据依赖性除外)的意义上是功能性的。一个属性不能设置两次,因为那样会违反顺序独立性(属性只能有一个值,不同时间不能有不同的值)。所以继承属性和合成属性是不相交的集合;每个属性要么应用于产生式左侧的符号(合成),要么应用于右侧的符号(继承)。

为了回答您提出的具体问题,您的两个属性都是继承的,因为它们适用于产生式右侧的符号。