编译器笔记22-语法制导翻译-S与L属性定义

S-属性定义

仅仅使用综合属性的SDD称为S属性的SDD,或S-属性定义、S-SDD。

例.png

如果一个SDD是S属性的,可以按照语法分析树节点的任何自底向上顺序来计算它的各个属性值。

S-属性定义可以在自底向上的语法分析过程中实现。

L-属性定义

L-属性定义(也称为L属性的SDD或L-SDD)的直观含义:在一个产生式所关联的各属性之间,依赖图的边的直观含义:在一个产生式所关联的各属性之间,依赖图的边可以从左到右,但不能从右到左(因此称为L属性的,L是Left的首字母)。

L-SDD的正式定义

L-SDD的正式定义.png

每个S-属性定义都是L-属性定义

问: 子节点Xi为什么不能依赖父节点A的综合属性,而只能依赖父节点的综合属性?
答: 这是因为父节点的综合属性可以依赖于子节点的综合属性当然也包括子节点的继承属性(上图两橙色箭头);若子节点的继承属性再依赖于父节点的综合属性就会造成循环依赖(如上图);因此子节点的继承属性只能依赖于父节点的继承属性而不能依赖于综合属性。

问: Xi的继承属性为什么只能依赖于其左边的符号的属性。
答: 其实理由跟第一条一样都是为了避免循环依赖的形成,如果Xi可以同时依赖其左右两侧符号的属性,则会形成循环依赖。假如存在X1X2X3,若X3的属性依赖左侧的X2的属性同时X2的属性又可以依赖右侧的X3属性,则会形成循环依赖。

例:L-SDD.png

问: 上图展示的SDD是不是LSDD?
答: L属性定义对综合属性没有限制,它只限制继承属性,因此此SDD是否为L-SDD取决于继承属性所依赖的属性值。第一个T'.inh依赖的是它左边兄弟的值,因此它不违反LSDD对继承属性的限制。第二个T'.inh依赖于其父亲节点的继承属性和其兄弟节点的值,也不违反LSDD对继承属性的限制。所以此SDD是LSDD。

例:非L属性的SDD.png

问: 上图展示的SDD是不是LSDD?
答: Q的继承属性依赖了它有边兄弟节点的综合属性,因此违法了LSDD的继承属性的限制。因此此SDD不是LSDD。

你可能感兴趣的:(编译器笔记22-语法制导翻译-S与L属性定义)