[工学]哈工大编译原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
和 * x=y。
2021/8/26计算机学院
10
6.1.4 三地址代码的具体实现
1.四元式 op, arg1, arg2, result
2.三元式 op, arg1, arg2
3.间接三元式 间接码表+三元式表
四元式需要利用较多的临时单元,四元式 之 间 的联系通过临时变量实现。
中间代码优化处理时,四元式比三元式方
procedure partition (y ,z :integer ) var i,j ,x,v: integer; begin … end;
begin … end;
2021/8/26计算机学院
30
P
M
ε②
proc Q
D

;N
D;
S③
2021/8/26计算机学院
ε⑤ D; S ③
proc P ; N
三地址语句的四元式表示
(- , c , , t1)
(* , b , t1 , t2)
(- , c , , t3)
(* , b , t1 , t4)
(+ ,t2 , t4 , t5)
(= , t5 , ,a)
2021/8/26计算机学院
13
三地址语句的三元式表示
op
arg1 arg2
(0) uminus c
a:=b * - c+b * -c
2021/8/26计算机学院
4
=
a
+
*
*
b
-
b
-
c
c
2021/8/26计算机学院
(a)语法树
5
赋值语句: 中 缀式: a:=b*-c+b*-c 后缀式:
abc-*bc-*+=
2021/8/26计算机学院
6
=
a
+
*
b
-
c
(b)dag(Directed Acyclic Graph)
便的多,间接三元式与四元式同样方便,两
种实现方式需要的存储空间大体相同。
2021/8/26计算机学院
11
常用三地址码的四元式表示:
1、 x=y op z
(op , y , z , x)
2、 x=op y 3、goto L
4、if x rop y goto L 5、x=y 6、parm x call p,n
22
嵌套说明的文法:
P→D D→D; D D→id :T D→proc id;D;S ……..
此处的T用于产生类型; S用于产生语句
2021/8/26计算机学院
23
嵌套说明的程序结构首先要解决的 问题是:非局部数据的访问
综合上述情况,对于程序结构采用分程 序结构的程序来说,要解决的问题是:
1. 局部数据的访问 2.非局部数据的访问
procedure quicksort(m,n : integer); var i ,k: integer;
procedure partition (y ,z :integer )
var i,j : integer;
begin … end;
begin … end;
begin … end. 2021/8/26计算机学院
2021/8/26计算机学院
P→D D→D; D D→id :T T→integer T→real T→array[num]of T1 T→ ↑T1
17
P→D{offset:=0}D
D→D; D
D→id :T {enter(,T.type,offset); offset:=offset+T.width}
4. enterproc(table,name, newtable) 号表
在外围过程符号表中建立内嵌过程的新
表项
2021/8/26计算机学院
27
翻译时用到的数据结构:
Tblptr是一个栈,用于存放指向嵌套外 层过程的符号表指针
Offset是一个栈,用于存放变量的相对 地址,当过程结束时,offset里记录的 是过程占用的所有字节数。
8
6.1.3 三地址语句的种类
(1)赋值语句 x:=y op z,op为二目算 术算符或逻辑算符;
(2)赋值语句 x:=op y ,op为一目算 符,如一目减uminus、逻辑非not、移位 算符及转换算符;
(3)无条件转移语句goto L;
(4)条件转移语句 if x relop y goto L,关
第六章 中间代码
2021/8/26
1
中间代码生成 6.1 中间语言 6.2 常用语句的翻译 6.2.1 说明语句 6.2.2 赋值语句 6.2.3 布尔表达式 6.2.4 过程语句
2021/8/26计算机学院
2

“中间代码生成”程 序的任务是把:经过语 法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。
系运算符号relop(< ,=,>= 等等);
2021/8/26计算机学院
9
(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ;
过程返回语句 return y; (7)索引赋值 x:=y[i] 及 x[i] :=y ; (8)地址和指针赋值 x=&y,x=* y
同时还要在直接外围过程符号表中增加 一个指向该过程D1符号表的指针
2021/8/26计算机学院
25
sort
Nil
header
x
a
readarray
exchange
quicksort
patition
Header
I
j
2021/8/26计算机学院
嵌套过程的符号表
readarray
header
i
exchange
(1)
*
b (0)
(2) uminus c
(3)
*
b (2)
(4)
+
(1) (3)
(5) assign
a (4)
三元式中使用指向三元式语句的指针。
2021/8/26计算机学院
14
三地址语句的间接三元式表示
statement
(0) (14) (1) (15) (2) (14) (3) (15) (4) (16) (5) (17)
T=Qt
0
Q
R
T=tp
4
J int
0
P Q

tabptr
04 0 0
offset
MDPNTD→→→→M{piεεneirdDtno{e:tcpgteTtueoir:dr(spt{{;{h{o(=ttNpapaop(p::tdd==oufo,T(mfddsDptpms.bhwwtt(e(kt1oylt(kbtpiitbtp;)pddatl,ttlpaetb(btrpbhbht)S:llt:lr,ep(l(rpit)ettd()tb,ott(=;rt=.roplno)p;p)poi;atp(ntpot(pmr;(ibptu)lpo(e);lueso(fgptph,osfbfeTtshfo;(frlr0esp.f)(p;tets,,tyTto()terop))0f)t.;}p))wef,o;s,(+iefodtftofst)Tffh}pesft.:(sew)oe;t)fit=d)f);}steh4t}})); 2021/8/26计算机学院 enterproc(top(tblptr),,t3)3}
方法:语法制导翻译。
采用独立于机器的中间代 码的好处:
1. 便于编译系统建立和编译系统的移植;
2. 便于进行独立于机器的代码优化工作。
2021/8/26计算机学院
3
6.1 中间语言 • 语法树 • 后缀式 • 三地址代码表示
6.1.1 图表示法
语法树,有向非循环图和后缀式表 示源程序的自然层次结构,例如:
因此,同一个标识符在不同的程序正文 中可能标识不同的对象, 具有不同的性 质,要求分配不同的存储空间。
2021/8/26计算机学院
20
于是提出下面的问题: 如何组织符号表, 使得同一个标识符在 不同的作用域中得到正确的引用而不产 生混乱。
进一步我们考虑一下具有嵌套定义的程 序结构
2021/8/26计算机学院
21
2pr.o嵌gra套m s的or程t(序inp结ut构,output);
var x, a : array[0..10] of integer;
procedure readarray; var i : integer; begin … end;
procedure exchange; begin … end;
2021/8/26计算机学院
28
处理嵌套过程中的说明语句翻译方案
P→MD {addwidth(top(tblptr),top(offset));

pop();pop(offset)}
M→ε {t:=mktable(nil);

push(t,tblptr);push(0,offset)}
D→D1;D2
op arg1 arg2
14 -- c 15 * b 14 16 + 14 15 17 = 15 a
语句的移动仅改变左边的语句表
2021/8/26计算机学院
15
6.2 常用语句的翻译
6.2.1 说明语句 说明语句的翻译:对每个局部名字,在符 号表中建立相应的表项填,写有关的信息. 如类型、嵌套深度、相对地址,内情向量等。
header
quicksort
Header
I
k
patition
26
翻译时常用操作指:向符直号接表外层
1. mktable( previ指ou向s)当创前过建程一符张新符号表
号表
2. Enter(table,name指,向ty直pe接,外of层fset)插入表项
符号表
3. addwidth(table,wi指dt向h符)内当号嵌记前表过外录程层总名指过域字向 程宽内 的层 符
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}
2021/8/26计算机学院
18
x:integer;y:real T.type=irnetal T.width=48
Name type
X
int
Y
real
kind …… addr
简单变量
0
简单变量
4
P Offset=0
(op , y , , x) (j , , , L)
(jrop ,x ,y , L) (= , y , ,x) (param, , ,x)
7、x=y[i] x[i]=y (=[] , y[i] , ,x)
8、x=&y x=*y
(=& , y , ,x)
2021/8/26计算机学院
12
对于语句a:=b*-c+b*-c 的三种表示方法
④ top(offset):= top(offset) +T.width}
N→ε {t :=mktable(top(tblptr));

push(t,tblptr);push(0,offset)}
例:procedure quicksort(m,n : integer);
var i : integer;
………… D
Offset=1042
D
;
D
x : T Enter;offset
2021/8/26计算机学院
Int T.type T.width
Y : T Enter;offset
real T.type T.width19
二、 保留作用域信息
1 .问题的提出
一般的语言中,标识符的作用在程 序正文中有一个确定的范围。
解决方法:为每一个过程建立一个符号表
2021/8/26计算机学院
24
具体翻译时,每当碰到过程说明 D→proc id;D1;S时,便创建一张符号表,并 且把D1中的所有说明都填入此符号表中
新表中有一个指针,指向其直接外围过 程符号表,用于解决非局部数据的访问
过程名id 作为直接外围过程的局部名字 记录在直接外围过程符号表中;
j: T ④
ε⑤
int *
31
上述语法树对应的语句: Proc Q;proc R;j:int;S;S 遍历语法树所得到的翻译序列:
② ⑤ ⑤* ④ ③ ③ ①
执行上面翻译序列符号表及栈的变化
2021/8/26计算机学院
32
主t ② ⑤ ⑤ * ④ ③ ③ ① 0 Q
t.type=int t.width=4
相对地址:相对静态数据区基址 或活动 记录中局部数据区基址的一个偏移值
1/8/26计算机学院
16
一、 过程中的说明语句
一个过程中的所有说明语句作为一 个类集来处理用。一个全程变量Offset来记录 下 一个数据在符号表中的相对地址。
下面是类型说 明和数组说明 的文法和翻译 方案
x:integer;y:real
2021/8/26计算机学院
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 对于语法树的代码
2021/8/26计算机学院
t1:=-c t2:=b*t1 t5:=t2+t2 a:= t5 对于dag的代码
D→proc id; N D1;S
{t:=top(tblptr);
addwidth(t,top(offset));
pop(tblptr);pop(offset);

enterproc(top(tblptr),,t)}
2021/8/26计算机学院
29
D→ id: T {enter(top(tblptr),,T.type, top(offset));
相关文档
最新文档