合成与继承属性

时间:2015-04-11 10:35:54

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

如何找到某个属性是从语法的产生中合成还是继承?

我想因为必须在问题中预定义属性 - 如果它的值取决于子节点或父节点。但有没有办法分析属性是从语法产生继承还是合成。

3 个答案:

答案 0 :(得分:9)

Synthesized Attribute :一个属性,它从附加到非终端子节点的属性中获取其值。

继承属性:从附加到其非终端的父(或兄弟)的属性获取其值的属性。

         **PRODUCTION**                             **SEMANTIC RULES**

             T->FT’                                    T’.inh=F.val
                                                       T.val=T’.syn

           T’->*FT1’                              T1’.inh=T’.inh*F.val
                                                      T’.syn=T1’.syn

             T’->Ɛ                                    T’.syn=T’.inh

             F->id                                   F.val=id.lexval

从给定的语法(作品)中可以看出, inh是一个继承属性,syn是一个合成属性


更新:Attribute Grammars

答案 1 :(得分:1)

从子节点获取数据值的属性称为合成属性。

这些也被称为s-referenced生产。 从父节点或兄弟节点获取值的属性称为继承属性。具有继承属性的生产规则(每个继承的属性仅限于从父级或左侧兄弟继承)称为L属性生产。

答案 2 :(得分:0)

让我们看看计算器

生产

  1. L-> E $
  2. E-> E1 + T
  3. E-> T
  4. T-> T1 * F
  5. T-> F
  6. F->(E)
  7. F->数字

语义规则

  1. print(E.val)
  2. E.val:= E1.val + T.val
  3. E.val:= T.val
  4. T.val:= T1.val * F.val
  5. T.val:= F.val
  6. F.val:= E.val
  7. F.val:= number.lexval