第八章中间代码生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6 多元式中间代码(续)
❖ 程序分析
每条指令有不同的地址 指令格式见书中介绍 简单说明中间代码的含义 中间代码的生成过程下次介绍
练习
❖ 写出下列表达式的逆波兰表示、三元式、四 元式、AGT和DAG
a * b * ( c - d ) / e -a + b * (-c + d) (a > b) ∩ (b < c)
3 后缀式(续)
❖ 后缀式
表达式的一种扩展,用于表式中间代码 适合于栈式机 后缀式特点
❖处理方便 ❖不用括号 ❖适合计算机处理
作用
❖用于代码生成
3 后缀式(续)
❖ 实例
中缀式
后缀式
a+b
ab+
a+b*c
abc*+
(a+b)*c
ab+c*
a:=b*c+ b*d
abc*bd*+:=
思考
设计一个中缀表达式到后缀表到式的算法
❖ 实例
表达式:a:=b*c + b*d 三元式:
1) (*, b, c) 2) (*, b, d) 3) (+, 1), 2)) 4) (:=, 3), a)
4 三地址(续)
❖ 实例
四元式
1) (*, b, c, t1) 2) (*, b, d, t2) 3) (+, t1, t2, t3) 4) (:=, t3, a, _)
便于代码生成和优化
5 AGT和DAG(续)
❖ 举例:表达式c:= a*b + a*b
:=
:=
c
+
c
+
*
*
a ba b
* ab
6 多元式中间代码
❖ 多元式
三元式的推广 用来表示非表达式的语法成分 可以有不同个数的分量
❖ 举例:程序段
read(a); read(b); if a>b then c:=a+5 else c:=b+5; write(2*(c-1))
6 多元式中间代码(续)
❖ 中间代码
1) (READI, a) 2) (READI, b) 3) (GT, a, b, t1) 4) (JUMPO, t1, l1) 5) (ADDI, addr(a), 5, t2) 6) (ASSIG, t2, addr(c)) 7) (JUMP, l2) 8) (LABEL, l1) 9) (ADDI, addr(b), 5, t3) 10) (ASSIG, t3, addr(c); 11) (LABEL, l2) 12) (SUBI, addr(c), 1, t4) 13) (MULT, 2, t4, t5) 14) (WRITEI, t5)
二者的区别
❖ 中间值的表示 ❖ 编号或临时变量
4 三地址(续)
❖ 三元式特点
简单 依赖位置 不便优化 便于代码生成
❖ 四元式特点
与三元式相反 不常用
4 三地址(续)
❖ 增加语义信息
设a,d为浮点型,b,c为整型 给出表达式a:=b*c + b*d的中间代码
三元式
四元式
1) (MULTI, addr(b),addr(c)) 1) (MULTI, addr(b), addr(c), t1)
5) (ADDF, t4, t3, t5)
6) (:=, (5), a)
6) (:=, t5, _, a源自文库dr(a))
4 三地址(续)
❖ 为什么进行整数与符点转换?
增加了语义的翻译 减少了需要保留的语义信息
5 AGT和DAG
❖ 概念
AGT:抽象语法树 DAG:有向无环图
❖ 作用
中间代码形式
❖ 特点
总结
❖ 重点
中间代码的几种形式
❖ 要求
自己能够根据给出的表达式写出相应的中间代码
❖ 作业
P322 1
❖ 直接生成目标代码的好处
避免重复性的工作 减少编译器的体积
2 中间语言(续)
❖ 常见的中间代码
后缀式 三地址
❖三元式 ❖四元式
图结构
❖AGT ❖DAG
3 后缀式
❖ 表达式的三种形式
前缀式 中缀式 后缀式
❖ 举例
例如:+ab, a+b, ab+
❖ 特点
利用操作符的位置来区分 分别符合人和计算机的习惯
1 引入(续)
❖ 前端
一般指源程序到中间代码
❖ 后端
中间代码到目标代码
❖ 区分前后端的好处? ❖ 产生中间代码的时机
语义分析
❖ 语义分析的功能(扩充)
进行语义检查 扫描声明部分,构造符号表 扫描语句部分,生成中间代码
2 中间语言
❖ 使用中间代码的好处
便于移植 便于修改 便于优化 便于掌握
2) (FLOAT, addr(b), _)
2) (FLOAT, addr(b), _, t2)
3) (MULTF, (2), addr(d)) 3) (MULTF, t2, addr(d), t3)
4) (FLOAT, (1), _)
4) (FLOAT, t1, _, t4)
5) (ADDF, (4), (3))
4 三地址
❖ 中间代码格式
(op, operand1, operand2, result)
❖ 说明
op:操作符 operand1:左操作数 operand2:右操作数 result:操作结果
❖ 含义
result:= operand1 op operand2
❖ 常见形式
三元式 四元式
4 三地址(续)
主要内容
1. 引入 2. 中间语言 3. 后缀式 4. 三地址 5. AGT和DAG
1 引入
❖ 中间代码
编译器在遍一过程中使用的一种标准形式的代码
❖ 中间代码的生成
生成过程与目标代码生成过程相似
❖ 编译器的分类
一遍:从源程序到目标码 多遍:中间要生成中间代码
❖ 例如:源程序—中间代码—目标代码