【问题标题】:Can an attribute be synthesized and inherited at the same time?一个属性可以同时合成和继承吗?
【发布时间】:2020-07-26 23:02:28
【问题描述】:

我读过 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属性也有什么不同吗?

【问题讨论】:

    标签: parsing compiler-construction abstract-syntax-tree semantic-analysis


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2014-08-25
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多