一个属性可以同时合成和继承吗?
Can an attribute be synthesized and inherited at the same time?
我读到 synthesized 和 inherited 属性是不相交的集合。但是我很难从定义中推导出来,这表明我对这些定义缺乏理解。
假设我有一个产生式 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
扩展语法。有了这个假设,很明显开始符号没有继承属性(因为它从来没有出现在产生式的右边),而终端没有合成属性(因为它从来没有出现在产生式的左边)制作。)
另外,合成属性的公式只能使用产生式右边符号的属性,因为任何属性公式都不能使用正在计算属性的符号的属性。然而,这不是“综合属性”的定义(虽然它经常被表示为一个);相反,它是定义的结果。另一方面,继承属性计算可能会使用左侧符号的属性,但这不是必需的。它们可能是常量,就像您的情况一样,或者它们可能只使用其他右侧符号。
在所有情况下,属性都应该没有副作用;属性语法模型在不依赖于执行顺序(数据依赖性除外)的意义上是功能性的。一个属性不能设置两次,因为那样会违反顺序独立性(属性只能有一个值,不同时间不能有不同的值)。所以继承属性和合成属性是不相交的集合;每个属性要么应用于产生式左侧的符号(合成),要么应用于右侧的符号(继承)。
为了回答您提出的具体问题,您的两个属性都是继承的,因为它们适用于产生式右侧的符号。
我读到 synthesized 和 inherited 属性是不相交的集合。但是我很难从定义中推导出来,这表明我对这些定义缺乏理解。
假设我有一个产生式 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
扩展语法。有了这个假设,很明显开始符号没有继承属性(因为它从来没有出现在产生式的右边),而终端没有合成属性(因为它从来没有出现在产生式的左边)制作。)
另外,合成属性的公式只能使用产生式右边符号的属性,因为任何属性公式都不能使用正在计算属性的符号的属性。然而,这不是“综合属性”的定义(虽然它经常被表示为一个);相反,它是定义的结果。另一方面,继承属性计算可能会使用左侧符号的属性,但这不是必需的。它们可能是常量,就像您的情况一样,或者它们可能只使用其他右侧符号。
在所有情况下,属性都应该没有副作用;属性语法模型在不依赖于执行顺序(数据依赖性除外)的意义上是功能性的。一个属性不能设置两次,因为那样会违反顺序独立性(属性只能有一个值,不同时间不能有不同的值)。所以继承属性和合成属性是不相交的集合;每个属性要么应用于产生式左侧的符号(合成),要么应用于右侧的符号(继承)。
为了回答您提出的具体问题,您的两个属性都是继承的,因为它们适用于产生式右侧的符号。