哈工大编译原理

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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}
h
3
6.1 中间语言 • 语法树 • 后缀式 • 三地址代码表示
6.1.1 图表示法
语法树,有向非循环图和后缀式表 示源程序的自然层次结构,例如:
a:=b * - c+b * -c
h
4
=
a
+
*
*
b
-
b
-
c
c
(a)语法树
h
5
赋值语句: 中 缀式: a:=b*-c+b*-c 后缀式:
abc-*bc-*+=
h
6
=
a
+
*
b
-
c
(b)dag(Directed Acyclic Graph)
h
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 对于语法树的代码
(4)条件转移语句 if x relop y goto L,
关系运算符号relop(< ,=,>= 等等);
h
9
(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ;
过程返回语句 return y;
(7)索引赋值 x:=y[i] 及 x[i] :=y ; (8)地址和指针赋值 x=&y,x=* y
(+ ,t2 , t4 , t5)
(= , t5 , ,a)
h
13
三地址语句的三元式表示
op
arg1 arg2
(0) uminus c
(1)
*
b (0)
(2) uminus c
(3)
*
b (2)
(4)
+
(1) (3)
(5) assign
a (4)
三元式中使用指向三元式语句的指针。
h
14
三地址语句的间接三元式表示
h
18
x:integer;y:real Name type kind …… addr
T.type=irnetal T.width=48
X
int 简单变量
0
Y
real 简单变量
4
P Offset=0
………… D
Offset=1042
D
;
D
x : T Enter;offset
Int T.type T.width
D→id :T
T→integer
T→real
T→array[num]of T1
T→ ↑T1
h
17
P→D{offset:=0}D
D→D; D
D→id :T {enter(id.name,T.type,offset); offset:=offset+T.width}
T→integer {T.type :=integer; T.width:= 4}
h
11
常用三地址码的四元式表示:
1、 x=y op z
(op , y , z , x)
2、 x=op y
(op , y , , x)
3、goto L
(j , , , L)
4、if x rop y goto L (jrop ,x ,y , L)
5、x=y
(= , y , ,x)
6、parm x call p,n (param, , ,x)
和 * x=y。
h
10
6.1.4 三地址代码的具体实现
1.四元式 op, arg1, arg2, result 2.三元式 op, arg1, arg2 3.间接三元式 间接码表+三元式表
四元式需要利用较多的临时单元,四元式 之 间 的联系通过临时变量实现。
中间代码优化处理时,四元式比三元式方 便的多,间接三元式与四元式同样方便,两 种实现方式需要的存储空间大体相同。
h
Y : T Enter;offset
real T.type T.width
19
二、 保留作用域信息
1 .问题的提出
一般的语言中,标识符的作用在程 序正文中有一个确定的范围。
因此,同一个标识符在不同的程序正文 中可能标识不同的对象,具有不同的性 质,要求分配不同的存储空间。
statement
(0) (14) (1) (15) (2) (14) (3) (15) (4) (16) (5) (17)
op arg1 arg2
14 -- c 15 * b 14 16 + 14 15 17 = 15 a
语句的移动仅改变左边的语句表
h
15
6.2 常用语句的翻译
6.2.1 说明语句 说明语句的翻译:对每个局部名字,在符号 表中建立相应的表项,填写有关的信息. 如类型、嵌套深度、相对地址,内情向量等。
7、x=y[i] x[i]=y (=[] , y[i] , ,x)
8、x=&y x=*y (=& , y , ,x)
h
12
对于语句a:=b*-c+b*-c 的三种表示方法
三地址语句的四元式表示
(- , c , , t1)
(* , b , t1 , t2)
(- , c , , t3)
(* , b , t1 , t4)
第六章 中间代码
h
1
中间代码生成 6.1 中间语言 6.2 常用语句的翻译 6.2.1 说明语句 6.2.2 赋值语句 6.2.3 布尔表达式 6.2.4 过程语句
h
2

“中间代码生成”程 序的任务是:把经过语 法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。
方法:语法制导翻译。
采用独立于机器的中间代 码的好处: 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。
相对地址:相对静态数据区基址 或活动记 录中局部数据区基址的一个偏移值
h
Biblioteka Baidu16
一、 过程中的说明语句
一个过程中的所有说明语句作为一个 类集来处理。用一个全程变量Offset来记录 下 一个数据在符号表中的相对地址。
下面是类型说 明和数组说明 的文法和翻译 方案
x:integer;y:real
P→D
D→D; D
h
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、移位 算符及转换算符;
(3)无条件转移语句goto L;
相关文档
最新文档