L属性的SDD

S属性的SDD每个属性都是综合属性,都是根据子构造的属性计算出父构造的属性。在依赖图中,总是通过子节点的属性值来计算父节点的属性值,可以与自底向上或自顶向下的语法分析过程一起计算

  • 自底向上:在构造分析树结点的同时计算相关的属性(此时子节点的属性必然已经计算完毕)

  • 自顶向下:在递归子程序法中,在过程A()的最后计算A的属性,此时A调用的其他过程(对应于其子结构)已经计算完毕。

在分析树上计算SDD,按照后序遍历的顺序计算属性值即可。在LR分析过程中,实际上不需要构造分析树结点。

S属性的SDD的局限

S属性的SDD中每个属性都是综合属性,便于计算。但是无法计算同时需要继承和综合属性的语义信息。

a的类型仅仅依赖自身和子节点的属性无法确定,必须依赖父节点和兄弟节点

L属性的SDD

每个属性是综合属性或继承属性,且

 且 AX1X2Xn 中计算 Xia 的规则只用A的继承属性,或Xi左边的文法符号Xj的继承属性或综合属性(j<i)\text { 且 } A \rightarrow X_{1} X_{2} \ldots X_{n} \text { 中计算 } X_{i} \cdot a \text { 的规则只用}A的继承属性,或\\X_i左边的文法符号X_j的继承属性或综合属性(j<i)

特点:依赖图中的边,综合属性是从下到上,继承属性是从上到下或从左到右计算一个属性值时,它所依赖的属性值已计算完毕

L属性SDD和自顶向下语法分析

  • 在递归程序法中实现L属性:对于每个非终结符号A,调用其对应过程前计算继承属性从过程返回前计算综合属性

L属性SDD其属性总可以按照如下方式计算:

非L属性的例子:

ABC A.s =B.b;B.i=f(C.c,A.s)A \rightarrow B C \quad \text { A.s }=B . b ; \quad B . i=f(C . c, A . s)

L属性的例子:基本类型数组类型的L属性定义

Last updated