说明语句的翻译模式 ■ 将语义动作中的计算向前移,使继承属性 的计算出现在其文法符号之前 1.D-T (L.in:=T.type}L 2.T-int {T.type:=integer} 3.T-real {T.type:=real} 4.L-L1.in:=L.in}L1,id {addtype(id.entry,L.in)} 5.L→id {addtype(id.entry,L.in)} ■问题:如何自下而上计算继承属性? 202514/2 D16
2025/4/2 16 说明语句的翻译模式 将语义动作中的计算向前移,使继承属性 的计算出现在其文法符号之前 1. D→T {L.in:=T.type} L 2. T→int {T.type:=integer} 3. T→real {T.type:=real} 4. L→{L1.in:=L.in} L1,id {addtype(id.entry,L.in)} 5. L→id {addtype(id.entry, L.in)} 问题:如何自下而上计算继承属性?
自下而上计算继承属性p176 ■解决方法 从翻译模式中去掉嵌入在产生式中间的动作 1.D→T M L 2.T→int {T.type:=integer} 3.T-real {T.type:=real} 4.L→ N L1,id {addtype(id.entry,L.in)} 5.L→id {addtype(id.entry,L.in)} ■引入6.M→e (L.in:=T.type} ■引入7.N→e{L.in:=L.in} 2025/4/2 节目绿☑)7
2025/4/2 17 解决方法 从翻译模式中去掉嵌入在产生式中间的动作 自下而上计算继承属性 p176 1. D→T{L.in:=T.type}L 2. T→int {T.type:=integer} 3. T→real {T.type:=real} 4. L→{L1.in:=L.in}L1,id {addtype(id.entry,L.in)} 5. L→id {addtype(id.entry,L.in)} 引入6. M→ε {L.in:=T.type} 引入7. N→ε {L1.in:=L.in} M N 节目录