L属性定义的属性计算 L dfvisit(n) form=从左到右的n的每个子节点do 计算m的继承属性; dfvisit(m) 计算n的综合属性
L_属性定义的属性计算 L_dfvisit(n) { for m=从左到右的n的每个子节点 do { 计算m的继承属性; L_dfvisit(m); } 计算n的综合属性。 }
翻译方案的例子 E∴=TR R = addop sprint(addop. lexeme)R1 T T: =numiprint(num. lexval) ·同时,翻译方案设计需要满足L属性定义。 E R Print (9) T Print(-) R t print(+)R 5 Print(5) Print(2) 少
翻译方案的例子 • E::=TR • R::=addop T{print(addop.lexeme)}R1 | 空 • T::=num{print(num.lexval)} • 同时,翻译方案设计需要满足L_属性定义。 E T R - T R + T R 2 Print(2) 空 Print(+) 5 Print(5) Print(9) Print(-) 9
翻译方案的设计 ·对于综合属性,只需要把属性的定乂修改称为赋值语句,放 在规则的最末尾就可以了 存在继承属性的时候,必须满足一下条件 重写规则右部符号的属性必须先于这个符号的语义动作 中计算。 个语义动作不能引用右边符号的综合属性 重写规则左部的符号的综合属性必须在它所引用的所有 属性都计算完成之后才可以计算 错误的例子:S:=AlA2{A1in-1,A2in=2} a: -a print(Ain)}应该把{Al.in-1}移到最前面。 L属性定义总存在相应的翻译方案
翻译方案的设计 • 对于综合属性,只需要把属性的定义修改称为赋值语句,放 在规则的最末尾就可以了。 • 存在继承属性的时候,必须满足一下条件: – 重写规则右部符号的属性必须先于这个符号的语义动作 中计算。 – 一个语义动作不能引用右边符号的综合属性。 – 重写规则左部的符号的综合属性必须在它所引用的所有 属性都计算完成之后才可以计算。 • 错误的例子:S::=A1A2 {A1.in=1, A2.in=2} A::=a {print(A.in)}.应该把{A1.in=1}移到最前面。 • L_属性定义总存在相应的翻译方案
翻译方案的实现(自底向上) S属性定义的翻译方案可以在分析输入符号串的时候完 成。 ·通过在栈中的每个符号添加一个属性项来完成 ·在移入的时候,把文法符号的属性同时压栈。终结符号 的属性在词法分析的时候获得 归约的时候,除了进行原来的工作之外,需要根据重写 规则和语义规则,根据栈顶部的符号属性计算出被归约 得到的符号的属性值 比如,如果需要按照U∵=XYZ归约,而相应的语义动作 为{Ua=(XxYy,Z,z)},那么栈顶部的符号为ZYX,从 这些符号的属性部分得到XxYy和Zz就可以计算得到 Ua。当把U压入栈的时候,同时把Ua的值压入属性栈
翻译方案的实现(自底向上) • S_属性定义的翻译方案可以在分析输入符号串的时候完 成。 • 通过在栈中的每个符号添加一个属性项来完成。 • 在移入的时候,把文法符号的属性同时压栈。终结符号 的属性在词法分析的时候获得。 • 归约的时候,除了进行原来的工作之外,需要根据重写 规则和语义规则,根据栈顶部的符号属性计算出被归约 得到的符号的属性值。 • 比如,如果需要按照U::=XYZ归约,而相应的语义动作 为{U.a=f(X.x, Y.y, Z.z)},那么栈顶部的符号为ZYX,从 这些符号的属性部分得到X.x, Y.y和Z.z就可以计算得到 U.a。当把U压入栈的时候,同时把U.a的值压入属性栈
实例 步骤 栈 输入规则 (#,) 3*5+4n (#,)(3,3) 来5+4n 23456789 1(#,)(F) 来5+4n F: =digit (#,)(T,3) 来5+4n T=F (#,)(T,3)(*,-) 5+4n (#,)(T,3)(*,-)(5,5) 5+4n (#,)(T,3)(*,-)(F,S +4n F∷= digit (#,)(T,15) +4n T=T*F (#,)(E,15) +4n E∴=T 10(#,)E,15)(+) 输入
实例 步骤 栈 输入 规则 1 2 3 5 6 7 8 (#,-)(F,3) (#,-)(T,3)(*,-) (#,-)(T,3)(*,-)(5,5) (#,-)(T,3)(*,-)(F,5) (#,-)(T,15) (#,-) (#,-)(3,3) *5+4n *5+4n 5+4n +4n +4n 3*5+4n *5+4n F::=digit 9 (#,-)(E,15) +4n E::=T F::=digit 10 (#,-)(E,15)(+,-) 输入 4 (#,-)(T,3) *5+4n T::=F T::=T*F