哈工大编译原理.ppt
《哈工大编译原理.ppt》由会员分享,可在线阅读,更多相关《哈工大编译原理.ppt(65页珍藏版)》请在三一办公上搜索。
1、1,第六章 中间代码,辛明影,2,中间代码生成 6.1 中间语言 6.2 常用语句的翻译 6.2.1 说明语句 6.2.2 赋值语句 6.2.3 布尔表达式 6.2.4 过程语句,辛明影,3,序“中间代码生成”程 序的任务是:,方法:语法制导翻译。,采用独立于机器的中间代 码的好处:,把经过语法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。,1.便于编译系统建立和编译系统的移植;,2.便于进行独立于机器的代码优化工作。,辛明影,4,6.1 中间语言 语法树 后缀式 三地址代码表示,6.1.1 图表示法 语法树,有向非循环图和后缀式表示源程序的自然层次结构,例如:a:=b*-c+b*
2、-c,辛明影,5,=,a,+,*,b,c,-,(a)语法树,*,-,c,b,辛明影,6,赋值语句:中 缀式:a:=b*-c+b*-c后缀式:a b c-*b c-*+=,辛明影,7,=,a,+,*,b,c,-,(b)dag(Directed Acyclic Graph),辛明影,8,6.1.2 三地址代码 一般形式 x:y op z,相应于图6.1的树和dag的三地址代码,t1:-c t2:b*t1 t5:t2+t2 a:=t5 对于dag的代码,t1:-c t2:b*t1 t3:-c t4:b*t3 t5:t2+t4 a:t5 对于语法树的代码,辛明影,9,(3)无条件转移语句goto L;
3、,(4)条件转移语句 if x relop y goto L,关系运算符号relop(,=,=等等);,(2)赋值语句 x:op y,op为一目算符,如一目减uminus、逻辑非not、移位算符及转换算符;,(1)赋值语句 x:y op z,op为二目算术算符或逻辑算符;,6.1.3 三地址语句的种类,辛明影,10,(5)复制语句 x:y;,(8)地址和指针赋值 xy,x*y 和*xy。,(7)索引赋值 x:=yi 及 xi:=y;,(6)过程调用语句 param x 和 call p,n;过程返回语句 return y;,辛明影,11,6.1.4 三地址代码的具体实现,1四元式 op,arg
4、1,arg2,result 2三元式 op,arg1,arg2 3间接三元式 间接码表+三元式表,四元式需要利用较多的临时单元,四元式之 间 的联系通过临时变量实现。,中间代码优化处理时,四元式比三元式方便的多,间接三元式与四元式同样方便,两种实现方式需要的存储空间大体相同。,辛明影,12,1、x=y op z,常用三地址码的四元式表示:,2、x=op y,3、goto L,4、if x rop y goto L,5、x=y,6、parm x call p,n,(op,y,z,x),(op,y,x),(j,L),(jrop,x,y,L),(=,y,x),(param,x),(=,yi,x),(
5、=&,y,x),8、x=&y x=*y,7、x=yi xi=y,辛明影,13,对于语句a:=b*-c+b*-c 的三种表示方法,三地址语句的四元式表示,(-,c,t1)(*,b,t1,t2)(-,c,t3)(*,b,t1,t4)(+,t2,t4,t5)(=,t5,a),辛明影,14,(0)(1)(2)(3)(4)(5),uminus*uminus*+assign,cbcb(1)a,arg1,(0)(2)(3)(4),arg2,op,三地址语句的三元式表示,三元式中使用指向三元式语句的指针。,辛明影,15,arg1,arg2,op,statement,(14)(15)(14)(15)(16)(1
6、7),(0)(1)(2)(3)(4)(5),三地址语句的间接三元式表示,语句的移动仅改变左边的语句表,-c*b 14+14 15=15 a,辛明影,16,相对地址:相对静态数据区基址,6.2.1 说明语句,6.2 常用语句的翻译,说明语句的翻译:,对每个局部名字,,在符号表中建立相应的表项,,填写有关的信息.,如类型、嵌套深度、相对地址,内情向量等。,或活动记录中局部数据区基址,的一个偏移值,辛明影,17,一、过程中的说明语句,下面是类型说明和数组说明的文法和翻译方案,PD DD;D Did:TTintegerTreal,x:integer;y:real,一个过程中的所有说明语句作为一个类集来
7、处理。,用一个全程变量Offset来记录下 一个数据在符号表中的相对地址。,Tarraynumof T1,T T1,辛明影,18,PD,DD;D,Did:T,Tinteger,Treal,Tarraynumof T1,T T1,offset:0D,enter(id.name,T.type,offset);offset:=offsetT.width,T.type:=integer;T.width:=4,T.type:real;T.width:8,T.type:array(num.val,T1.type);T.width:num.val*T1.width,T.type:pointer(T1type
8、);T.width:=4,辛明影,19,Name type kind addrXY,real 简单变量 4,int 简单变量 0,x:integer;y:real,P,Offset=0,D,D,D,;,x,:,T,Y,:,T,Enter;offset,Enter;offset,Offset=0,Offset=4,Offset=12,Int,real,T.typeT.width,T.typeT.width,T.type=intT.width=4,T.type=realT.width=8,辛明影,20,1.问题的提出,二、保留作用域信息,一般的语言中,标识符的作用在程序正文中有一个确定的范围。,因
9、此,同一个标识符在不同的程序正文中可能标识不同的对象,,具有不同的性质,要求分配不同的存储空间。,辛明影,21,于是提出下面的问题:,如何组织符号表,,使得同一个标识符在不同的作用域中得到正确的引用而不产生混乱。,进一步我们考虑一下具有嵌套定义的程序结构,辛明影,22,2.嵌套的程序结构,program sort(input,output);var x,a:array0.10 of integer;begin end.,procedure readarray;var i:integer;begin end;,procedure quicksort(m,n:integer);var i,k:in
10、teger;begin end;,procedure exchange;begin end;,procedure partition(y,z:integer)var i,j:integer;begin end;,辛明影,23,嵌套说明的文法:,PD DD;D Did:TDproc id;D;S.,此处的T用于产生类型;S用于产生语句,辛明影,24,嵌套说明的程序结构首先要解决的问题是:非局部数据的访问,综合上述情况,对于程序结构采用分程序结构的程序来说,要解决的问题是:,局部数据的访问,2.非局部数据的访问,解决方法:为每一个过程建立一个符号表,辛明影,25,具体翻译时,每当碰到过程说明Dpr
11、oc id;D1;S时,便创建一张符号表,并且把D1中的所有说明都填入此符号表中,新表中有一个指针,指向其直接外围过程符号表,用于解决非局部数据的访问,同时还要在直接外围过程符号表中增加一个指向该过程D1符号表的指针,过程名id 作为直接外围过程的局部名字记录在直接外围过程符号表中;,辛明影,26,Nil header x a readarray exchange quicksort,sort,header i,header,readarray,exchange,Header I k patition,Header I j,quicksort,patition,嵌套过程的符号表,辛明影,27,
12、翻译时常用操作:,4.enterproc(table,name,newtable)在外围过程符号表中建立内嵌过程的新表项,1.mktable(previous)创建一张新符号表,2.Enter(table,name,type,offset)插入表项,3.addwidth(table,width)记录总域宽,指向直接外层符号表,指向当前过程符号表,指向直接外层符号表,指向内层过程的符号表,指向当前外层符号表,内嵌过程名字,辛明影,28,Tblptr是一个栈,用于存放指向嵌套外层过程的符号表指针,Offset是一个栈,用于存放变量的相对地址,当过程结束时,offset里记录的是过程占用的所有字节数
13、。,翻译时用到的数据结构:,辛明影,29,处理嵌套过程中的说明语句翻译方案,PMDaddwidth(top(tblptr),top(offset);pop();pop(offset),M t:=mktable(nil);push(t,tblptr);push(0,offset),DD1;D2,Dproc id;N D1;St:top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t),辛明影,30,D id:T enter(top(tblptr),id.name,T.ty
14、pe,top(offset);top(offset):=top(offset)T.width,例:,procedure quicksort(m,n:integer);var i:integer;begin end;,procedure partition(y,z:integer)var i,j,x,v:integer;begin end;,N t:mktable(top(tblptr);push(t,tblptr);push(0,offset),辛明影,31,P,M,D,proc,Q,;,N,D,;,S,proc,P,;,N,D,;,S,j,:,T,int,辛明影,32,上述语法树对应的语句:
15、Proc Q;proc R;j:int;S;S,遍历语法树所得到的翻译序列:,执行上面翻译序列符号表及栈的变化,辛明影,33,tabptr offset,t,主,0,主,T=Q,Q,0,Q,T=p,P,0,*,t.type=intt.width=4,J int 0,4,t,4,R,t,0,Q,0,M t:=mktable(nil);push(t,tblptr);push(0,offset),N t:mktable(top(tblptr);push(t,tblptr);push(0,offset),N t:mktable(top(tblptr);push(t,tblptr);push(0,off
16、set),TintegerT.type:=integer;T.width:=4,D id:T enter(top(tblptr),id.name,T.type,top(offset);top(offset):=top(offset)T.width,Dproc id;N D1;St:top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t),Dproc id;N D1;St:top(tblptr);addwidth(t,top(offset);pop(tblptr);pop
17、(offset);enterproc(top(tblptr),id.name,t),PMDaddwidth(top(tblptr),top(offset);pop(tblptr);pop(offset),辛明影,34,一组嵌套过程,每个过程说明为局部名字建立一个符号表,所有正在翻译过程的符号表组成整个源程序的符号表。,翻译语句部分时查找符号表,查找过程的符号表的路线相当于当前被 翻译过程的静态链。,辛明影,35,三、记录中的域名 T record LD end T.type:=record(top(tblptr);T.width:top(offset);pop(tblptr);pop(offs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 编译 原理
链接地址:https://www.31ppt.com/p-6556359.html