语法分析树上的SDD求值(2) 按照分析树中的分支对应的文法产生式,应用相 应的语义规则计算属性值 。计算顺序 如果某个结点N的属性a为fN1.bvN2.b2,Nkb),那 么我们需要先算出N1.bvN2.b2,Nkbk的值 如果可以给各个属性值排出计算顺序,那么这个 注释分析树就可以计算得到 S属性的SDD一定可以按照自底向上的方式求值 下面的SDD不能计算 A→B A.s=B.i B.i=A.s+1 11
语法分析树上的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 11 南大编译许畅
注释分析树的例子 3*5+4n L.val =19 E.val=19 n E.val =15 T.val=4 T.val 15 F.val=4 T.val 3 米 F.val=5 digit.lexval=4 F.val=3 digit.lexval =5 digit.lexval 3 12
注释分析树的例子 12 3 * 5 + 4 n 南大编译许畅
适用于自顶向下分析的SDD(1) 前面的文法存在左递归,我们无法用自顶向下的 分析方法进行处理 但消除左递归之后,我们无法直接使用属性vl进 行处理 比如规则:T→FT T>*FTI T对应的项中,第一个因子对应F,而运算符却在T中 需要用继承属性来完成这样的计算 比较T→T*FIF 13
适用于自顶向下分析的SDD (1) • 前面的文法存在左递归,我们无法用自顶向下的 分析方法进行处理 • 但消除左递归之后,我们无法直接使用属性val进 行处理 – 比如规则:T → F T' T' → * F T' | – T对应的项中,第一个因子对应F,而运算符却在T'中 – 需要用继承属性来完成这样的计算 13 南大编译许畅 比较T → T * F | F
适用于自顶向下分析的SDD(2) 产生式 语义规则 1 TFT T'.inh F.val T.val T'.syn 比较T→T*FIF 2)T'→*FT T.imh=T.inh×F.val T'.syn Tf.syn 3)T'→e T'.syn T'.inh 4) F→digit F.val digit.lexval T的属性imh实际上继承了相应的*号的左运算分量 14
适用于自顶向下分析的SDD (2) T'的属性inh实际上继承了相应的*号的左运算分量 14 比较T → T * F | F 南大编译许畅
3*5的注释分析树 产生式 语义规则 ·观察inh属性的传递 T.inh F.val T.val=T'.syn 2)T'→*FT T'.inh T'.inh x F.val T'.syn T1.syn 3)T'+e T'.syn T'.inh T.val =15 4)F digit F.val=digit.lexval F.val =3 T'.inh =3 T'.syn =15 ligit.lexval-③ F.val=5 T1.2nh=15 Tl.syn =15 digit.lerval-⑤ 15
3 * 5的注释分析树 • 观察inh属性的传递 15 南大编译许畅