说明语句的翻译模式 将语义动作中的计算向前移,使继承属性 的计算出现在其文法符号之前 1.D-T {L.in:=T.type}L 2.T→nt {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)} 问题:如何自下而上计算继承属性? 2023/2/28 I 16
2023/2/28 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 ■引入6.Maddtype(id.enttypb}in)} ■引入7.N→eL1.in:=L.in e23/2/28 节目绿可D17
2023/2/28 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 引入6. {addtype(id.entry,L.in)} M→ε {L.in:=T.type} 引入7. N→ε {L1.in:=L.in} M N 节目录
中间代码形式p208 (Intermediate language/code/representation) ■许多编译程序采用的独立于机器的、复杂性 界于源语言和机器语言之间语言 ■源程序的一种内部表示一一中间代码序列 (中间语言的语句) ■用中间语言过渡的好处 ◆便于进行与机器无关的优化工作 ◆使编译程序改变目标机容易,便于移植 ◆使编译程序的结构在逻辑上更为简单明确 2023/2/28 ☒D18
2023/2/28 18 中间代码形式 p208 (Intermediate language/code/representation) 许多编译程序采用的独立于机器的、复杂性 界于源语言和机器语言之间语言 源程序的一种内部表示——中间代码序列 (中间语言的语句) 用中间语言过渡的好处 便于进行与机器无关的优化工作 使编译程序改变目标机容易,便于移植 使编译程序的结构在逻辑上更为简单明确
中间语言p208 ■常见形式 ◆图表示法 抽象语法树、DAG图 ◆三地址代码(抽象描述) 四元式(具体实现) ■特点 ◆形式简单、语义明确、便于翻译 ◆独立于目标语言 2023/2/28 章节目绿同☑9
2023/2/28 19 中间语言 p208 章节目录 常见形式 图表示法 抽象语法树、DAG图 三地址代码(抽象描述) 四元式(具体实现) 特点 形式简单、语义明确、便于翻译 独立于目标语言