【问题标题】:Why can terminals have synthesized attributes but not inherited attributes?为什么终端可以有综合属性而不能继承属性?
【发布时间】:2020-09-30 04:10:43
【问题描述】:

在 Aho 等人的《编译器:原理、技术和工具》第 305 页中,它说“终端可以具有综合属性,但不能具有继承属性。”这是我的挂断:如果合成属性是可以基于节点的子节点计算的属性,而继承的属性可以基于节点的父节点和兄弟节点计算,那么这对我来说是错误的,因为终端将是解析树他们不会有任何孩子。如果他们没有任何孩子,那么他们应该无法拥有综合属性。同样,由于它们是叶子,因此它们很可能具有父节点,因此可能具有继承的属性。如果有人能指出我在这里出错的地方,那就太棒了。

【问题讨论】:

    标签: grammar code-translation parse-tree


    【解决方案1】:

    当我第一次在龙书上看到时,我也很困惑。但如果你想一想,它就会变得清晰。终端合成属性不是来自解析器;相反,它们来自词法分析器。举个例子,假设你有一个终端 digit(例子来自龙书)。 digit 具有合成属性lexval。此合成属性并非来自解析器。它来自词法分析器。应该很清楚为什么终端不能具有继承属性:)

    【讨论】:

    • 如果您希望终端具有继承属性,您可以使用非终端来模拟,其唯一的生产是右手边,终端作为其唯一符号。所以这个限制在实践中并不是很重要,但是对于作者想要做出的一些理论陈述来说是很方便的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2014-02-03
      • 2014-08-25
      • 2017-08-10
      • 1970-01-01
      • 2017-02-06
      • 2023-04-07
      相关资源
      最近更新 更多