语法分析树上的SDD求值(2) ·按照分析树中的分支对应的文法产生式,应用 相应的语义规则讣算属性值 计算顺序问题: 如果某个结点N的属性a为fN1b12N2.b2,Nkb), 那么我们需要先算出N1b1N2b2,Nkb的值。 如果我们可以给各个属性值排出讣算顺序,那 么这个注释分析树就可以计算得到。 S属性的SDD一定可以按照自底向上的方式求值。 下面的SDD不能计算 A→B AS=B B. 1=A S+l
语法分析树上的SDD求值(2) • 按照分析树中的分支对应的文法产生式,应用 相应的语义规则计算属性值 • 计算顺序问题: – 如果某个结点N的属性a为f(N1 .b1 ,N2 .b2 ,…,Nk .bk ), 那么我们需要先算出N1 .b1 ,N2 .b2 ,…,Nk .bk的值。 • 如果我们可以给各个属性值排出计算顺序,那 么这个注释分析树就可以计算得到。 – S属性的SDD一定可以按照自底向上的方式求值。 • 下面的SDD不能计算 – A→B A.s=B.i; B.i=A.s+1;
注释分析树的例子 L. val=19 E.val= 19 E.val= 15 T.val= 4 T. val=15 F.val= 4 T.val= 3 F val= 5 digit. lecval= 4 F.val= 3 digit larval=5 digit larval= 3
注释分析树的例子
适用于自顶向下分析的SDD 前面的表达式文法存在直接左递归,因此 无法直接用自顶向下方法处理。 消除左递归之后,我们无法直接使用属性 val进行处理 比如规则:T→FT T→*FT T对应的项中,第一个因子对应于F.而远算符 却在T中。 需要继承属性来完成这样的计算
适用于自顶向下分析的SDD • 前面的表达式文法存在直接左递归,因此 无法直接用自顶向下方法处理。 • 消除左递归之后,我们无法直接使用属性 val进行处理: – 比如规则:T→FT’ T’→*FT’ – T对应的项中,第一个因子对应于F,而运算符 却在T’中。 – 需要继承属性来完成这样的计算
相同表达式的不同文法的比较 输入串:3*4*5 请观察左边的T对应的部分,和右边的T对应部分 T和T恰好互补 ·计算方法:把T之外部分的值继承给T。 3 T2 F F digit: 5 F digit: 3 digit: 4 digit: 4 digit: 3 digit:5ε
相同表达式的不同文法的比较 • 输入串:3*4*5 • 请观察左边的T对应的部分,和右边的T’对应部分 – Ti和T’i恰好互补 • 计算方法:把T’之外部分的值继承给T’。 T3 * F digit:4 digit:5 T2 T1 F digit:3 F * T F * ε T’3 F F * digit:3 digit:4 T’2 T’1 digit:5
适用于自顶向下分析的SDD 产生式 语义规则 1)T→FT Tinh= fval T val= TI Sy/70 2)T'+*FTI T1 inh=T' inh x F. val Sm三 3)T→∈ Tinh 4)F+digit F.val= digit. lecval 注意:T的属性inh实际上继承了相应的*号的 左运算分量
适用于自顶向下分析的SDD • 注意:T’的属性inh实际上继承了相应的*号的 左运算分量