中间代码(精)
辛明影 3
6.1 中间语言
• 语法树 • 后缀式 • 三地址代码表示 6.1.1 图表示法 语法树,有向非循环图和后缀式表 示源程序的自然层次结构,例如: a:=b * - c+b * -c
辛明影 4
= a +
*
b c (a)语法树 辛明影 b
*
c
5
赋值语句:
中 缀式: a:=b*-c+b*-c
后缀式:
abc-*bc-*+=
辛明影
6
= a +
*
b c (b)dag(Directed Acyclic Graph)
辛明影 7
6.1.2 三地址代码
一般形式 x:=y op z
相应于图6.1的树和dag的三地址代码
t1 := -c t2 := b* t1 t3 := -c t4 := b* t3 t5 := t2+t4 a := t5 对于语法树的代码
第六章 中间代码
1
中间代码生成
6.1 中间语言
6.2 常用语句的翻译
6.2.1 说明语句
6.2.2 赋值语句
6.2.3 布尔表达式 6.2.4 过程语句
辛明影
2
序
“中间代码生成”程 序的任务是: 把经过语 法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。
方法:语法制导翻译。 采用独立于机器的中间代 码的好处: 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。
辛明影 17
x:integer;y:real
P→D {offset:=0}D D→D; D D→id :T {enter(,T.type,offset); offset:=offset+T.width} T→integer {T.type :=integer; T.width:= 4} T→real {T.type:=real; T.width :=8} T→array[num]of T1 {T.type:=array(num.val, T1.type); T.width: =num.val *T1.width} T→ ↑T1 {T.type:=pointer(T1.type); T.width := 4}
辛明影
16
一、 过程中的说明语句 一个过程中的所有说明语句作为一个 用一个全程变量Offset来记录 类集来处理。 下 一个数据在符号表中的相对地址。
下面是类型说 明和数组说明 的文法和翻译 方案
P→D D→D; D D→id :T T→integer T→real T→array[num]of T1 T→ ↑T1
中间代码优化处理时,四元式比三元式方 便的多,间接三元式与四元式同样方便,两 种实现方式需要的存储空间大体相同。
辛明影 11
常用三地址码的四元式表示: 1、 x=y op z (op , y , z , x) 2、 x=op y (op , y , , x) (j , , , L) 3、goto L 4、if x rop y goto L (jrop ,x ,y , L) (= , y , ,x) 5、x=y 6、parm x call p,n (param, , ,x)
(8)地址和指针赋值 x=&y,x=* y
和 * x=y。
辛明影
10
6.1.4 三地址代码的具体实现
1.四元式 op, arg1, arg2, result
2.三元式 op, arg1, arg2
3.间接三元式 间接码表+三元式表 四元式需要利用较多的临时单元,四元式 之 间 的联系通过临时变量实现。
(= , t5 ,
,a)
辛明影 13
三地址语句的三元式表示
op uminus * uminus * + assign arg1 c b c b (1) a arg2 (0) (2) (3) (4)
(0) (1) (2) (3) (4) (5)
三元式中使用指向三元式语句的指针。
辛明影 14
三地址语句的间接三元式表示
statement (0) (1) (2) (3) (4) (5) (14) (15) (14) (15) (16) (17)
op
a17
*
+ =
b
14 15
14
15 a
语句的移动仅改变左边的语句表
辛明影 15
6.2 常用语句的翻译
6.2.1 说明语句 说明语句的翻译:对每个局部名字, 在符号 填写有关的信息. 表中建立相应的表项, 如类型、嵌套深度、相对地址,内情向量等。 相对地址:相对静态数据区基址 或活动记 录中局部数据区基址的一个偏移值
辛明影 18
x:integer;y:real T.type=int T.type=real
T.width=4 T.width=8
P Offset=0 D x : T
Name
X Y
type
int real
kind
……
addr
0 4
简单变量 简单变量
…………
D
; Enter;offset Y
Offset=4 Offset=0 Offset=12
(3)无条件转移语句goto L;
(4)条件转移语句 if x relop y goto L, 关系运算符号relop(< ,=,>= 等等);
辛明影 9
(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ;
过程返回语句 return y;
(7)索引赋值 x:=y[i] 及 x[i] :=y ;
辛明影
t1:=-c t2:=b*t1 t5:=t2+t2 a:= t5 对于dag的代码
8
6.1.3 三地址语句的种类
(1)赋值语句 x:=y op z,op为二目 算术算符或逻辑算符; (2)赋值语句 x:=op y ,op为一目算 符,如一目减uminus、逻辑非not、移位 算符及转换算符;
D : T Enter;offset
Int T.type T.width
7、x=y[i] x[i]=y 8、x=&y x=*y
辛明影
(=[] , y[i] ,
,x)
(=& , y ,
,x)
12
对于语句a:=b*-c+b*-c 的三种表示方法
三地址语句的四元式表示
(- , c , , t1)
(* , b , t1 , t2) (- , c , , t3) (* , b , t1 , t4) (+ ,t2 , t4 , t5)