中间代码生成.ppt
《中间代码生成.ppt》由会员分享,可在线阅读,更多相关《中间代码生成.ppt(155页珍藏版)》请在三一办公上搜索。
1、中间代码生成,第八章 中间代码生成,中间代码说明语句的翻译赋值语句的翻译控制语句的翻译(if、循环)属性文法的实现过程调用的翻译,8.1 中间代码,作用过渡:经过语义分析被译成中间代码序列形式中间语言的语句优点便于编译系统的实现、移植、代码优化,常用的中间代码(语言),三地址代码(四元式)语法(结构)树(三元式)(5.2节)后缀式逆波兰表示(2.3节)特点形式简单、语义明确、便于翻译独立于目标语言,例 8-1 表达式(A-12)*B+6 的中间代码,+,*,6,-,A,12,B,三地址码T1=A-12T2=T1*BT3=T2+6,四元组(-,A,12,T1)(*,T1,B,T2)(+,T2,6
2、,T3),三元组(-,A,12)(*,B)(+,6),波兰表示+*-A12B6逆波兰表示A12-B*6+,如何生成语言结构的三地址码,类似于构建语法树生成后缀表示,以S:=(A-12)*B+6为例将赋值语句变换为语法结构树,属性设置E.p 是语法结构树指针id.entry 是名字的符号表入口num.val 是数值基本函数结点构造mknode 建中间结点mkleaf 建叶结点,6,A,12,-,+,B,*,S,:=,生成赋值语句语法树的语法制导定义,例 8-2:a:=b*(-c)+b*(-34)的语法结构树直观描述,:=,*,-,0,+,*,-,0,id,b,num,34,id,b,id,c,i
3、d,a,root,语法结构树数组存储形式,地址 算符 操作数 操作数012345678910,a:=b*(-c)+b*(-34),以语法分析为中心,后缀式(逆波兰表示),操作数 1,操作数 2,运算符操作数,运算符例 8-7:a:=b*(-c)+b*(-34)的后缀式a b c-*b 34-*+:=,生成后缀式的属性文法,三地址代码,一般形式 x:=y op z其中 x,y,z 为变量名、常数或编译产生的临时变量四元式(op,y,z,x),种类:x:=y op z 双目运算 x:=op y 单目运算 x:=y 赋值语句 if x relop y goto l 条件转移语句(relop,x,y,
4、l),其它语句的三地址代码,goto l 无条件转移 param x 实在参数 call p,n 过程调用 return x 过程返回 x:=yi数组运算 xi:=y x:=&y指针运算 x:=*y*x=y,生成三地址码的属性文法,8.2 说明语句的翻译,作用说明语句(Declarations)用于对程序中规定范围内使用的各类变量、常数、过程进行说明编译要完成的工作在符号表中记录被说明对象的属性,为执行做准备,要关心的问题,类型基本类型/内部类型(built-in):整型、实型、双精度型、逻辑型、字符型用户定义类型结构描述作用域有效范围一般:说明所在的分程序、过程,要关心的问题,类型的作用引入
5、数据抽象、隐蔽数据的基本表示用户无需注明字节数规定可用的运算类型检查数据精度控制规定存储单元的字节数,优化空间管理,变量说明的翻译,在符号表中填写变量的属性种别、类型、相对地址、作用域等相对地址全局变量表示为静态数据区的偏移值(offset)局部变量表示为局部数据区(活动记录部分)的偏移值两种数据区,例 8-3:相对地址举例,名字 相对地址x 0i64j68,08566468,beginreal x8;integer i,j;end,文法描述,P DD D;DD id:TT integer T realT arraynum of T1 T T1,例如:a:integer;b:real;c:ar
6、ray10of real,属性、过程、与全局量,文法变量T(类型)的属性type 类型width 占用的字节数基本子程序enter:设置变量的类型和地址array:数组类型处理全局量offset:已分配空间字节数,说明语句的翻译模式,P offset:=0 DDD;DDid:T enter(id.name,T.type,offset);offset:=offset+T.widthTinteger T.type:=integer;T.width:=4Treal T.type:=real;T.width:=8Tarray num of T1 T.type:=array(num.val,T1.typ
7、e);T.width:=num.val*T1.widthTT1 T.type:=pointer(T1.type);T.width:=4,PMDM offset:=0,例 8-4 x:real;i:integer 的翻译,enter(x,real,0),offset=0,offset=8,T.type=realT.width=8,offset=12,T.type=integerT.width=4,enter(i,integer,8),Did:T enter(id.name,T.type,offset);offset:=offset+T.width,例 8-4 x:real;i:integer 的
8、翻译,Poffset:=0Doffset:=0D;Doffset:=0 x:Tenter(x,T.type,offset);offset:=offset+T.width;Doffset:=0 x:realT.type:=real;T.width:=8 enter(x,T.type,offset);offset:=offset+T.width;Dx:real(x,real,0);offset:=8;Dx:real(x,real,0);offset:=8;i:Tenter(id.name,T.type,offset);offset:=offset+T.widthx:real(x,real,0);o
9、ffset:=8;i:integerT.type:=integer;T.width:=4enter(i,T.type,offset);offset:=offset+T.widthx:real(x,real,0);i:integer(i,integer,8);offset:=12,作用域信息的保存,所讨论语言的文法P D SD D;D|id:T|proc id;D;S 语义动作用到的函数mktable(previous):创建一个新的符号表;enter(table,name,type,offset)addwidth(table,width):符号表的大小;enterproc(table,name
10、,newtable)在table指向的符号表中为name建立一个新表项;,P M D S addwidth(top(tblptr),top(offset);pop(tblptr);pop(offset)M t:=mktable(nil);push(t,tblptr);push(0,offset)D D1;D2D proc id;N D1;S t:=top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t)Did:T enter(top(tblptr),id.name,T.
11、type,top(offset);top(offset):=top(offset)+T.widthN t:=mktable(top(tblptr);push(t,tblptr);push(0,offset),处理嵌套过程中的说明语句,program sort(input,output);var a:array0.10 of integer;x:integer;procedure readarray;var i:integer;begin aend;procedure exchange(i,j:integer);begin x:=ai;ai:=aj;aj:=x;end;procedure qui
12、cksort(m,n:integer);var k,v:integer;function partition(y,z:integer):integer;var i,j:integer;begin a v exchange(i,j)end;begin end;begin end;,例:一个带有嵌套的pascal程序(图7-22),表 头,空,sort,offset,tblptr,top,top,0,表 头,空,sort,offset,tblptr,top,top,40,a array 0,x integer 40,a array 0,表 头,空,sort,offset,tblptr,top,to
13、p,44,表 头,空,sort,readarrary,表 头,offset,tblptr,top,top,44,0,a array 0,x integer 40,表 头,空,sort,readarrary,表 头,offset,tblptr,top,top,44,4,a array 0,x integer 40,i integer 0,表 头,空,sort,readarrary,表 头 4,offset,tblptr,top,top,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,表 头,空,sort,readarrary
14、,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头,top,top,0,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a arra
15、y 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,0,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,4,k integer 0,表 头,空,sort,readar
16、rary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchang
17、e,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,0,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,4,i integer 0,表 头,空,sort,readarr
18、ary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,8,i integer 0,j integer 4,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向r
19、eadarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头 8,partition,i integer 0,j integer 4,partition,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头 8,quickso
20、rt,k integer 0,v integer 4,表 头 8,partition,i integer 0,j integer 4,partition,quicksort,表 头 44,空,sort,readarrary,表 头 4,offset,tblptr,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头 8,quicksort,k integer 0,v integer 4,表 头 8,partition,i integer 0,
21、j integer 4,partition,quicksort,记录说明的翻译,空间分配设置首地址和各元素的相对地址大于所需的空间(对齐)例:struct Node float x,y;struct node*next;node;,0,4,8,记录说明的翻译,符号表及有关表格处理为每个记录类型单独构造一张符号表将域名id的信息(名字、类型、字节数)填入到该记录的符号表中所有域都处理完后,offset将保存记录中所有数据对象的宽度T.type通过将类型构造器record应用于指向该记录符号表的指针获得,记录的域名,T record D endT record L D endT.type:=rec
22、ord(top(tblptr);T.width:=top(offset);pop(tblptr);pop(offset)L t:=mktable(nil);push(t,tblprt);push(0,offset),数组说明的翻译,符号表及有关表格(内情向量)处理维数、下标上界、下标下界、类型等空间分配首地址、需用空间计算存放方式按行存放、按列存放影响具体元素地址的计算,数组的引用与分配策略,操作元素的引用、修改:数组:Ai,j,k 记录、结构、联合:B.h.j结构的引用、修改:A,B,A.c分配策略静态:直接完成相应的分配工作动态:构造代码,以在运行时调用分配过程,静态数组分配要完成的工作,
23、数组存放在一个连续的存储区中知道起始地址要计算该数组的大小按照与简单变量类似的方式进行分配,?哪些要处理的问题准备上下界的计算体积的计算动态分配子程序将计算的结果告诉动态分配子程序进行分配,动态数组分配要完成的工作,动态分配方案下数组说明的代码结构,D id:array low1:up1,lown:upn of T,low1.code送工作单元W1up1.code送工作单元W2lown.code送工作单元W2n-1upn.code送工作单元W2n,动态分配子程序其它参数(n,type)转动态分配子程序入口,?D id:array num of T,8.4 赋值语句的翻译,翻译的需求充分了解各种
24、语言现象的语义包括:控制结构、数据结构、单词充分了解它们的实现方法目标语言的语义了解中间代码的语义了解运行环境,实现赋值语句的翻译,基本子程序gen(code),emit(code):产生一条中间代码newtemp:产生新的临时变量lookup:检查符号表中是否出现某名字属性设置中间代码序列 code存储位置 place,为赋值语句产生三地址码的翻译模式,S id:=E p:=lookup(id.name);if p nil thenemit(p,:=,E.place)else error E E1+E2E.place:=newtemp;emit(E.place,:=,E1.place,+,E
25、2.place)E E1 E.place:=newtemp;emit(E.place,:=,uminus,E1.place)E(E1)E.place:=E1.place E id p:=lookup(id.name);if p nil then E.place:=p else error,临时名字的重用,大量临时变量的使用对优化有利大量临时变量会增加符号表管理的负担也会增加运行时临时数据占的空间E E1+E2的动作产生的代码的一般形式为计算E1到t1计算E2到t2t3:=t1+t2()()()()临时变量的生存期像配对括号那样嵌套或并列,基于临时变量生存期特征的三地址代码,x:=a b+c d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中间 代码 生成
链接地址:https://www.31ppt.com/p-5812563.html