中间代码生成.ppt
《中间代码生成.ppt》由会员分享,可在线阅读,更多相关《中间代码生成.ppt(155页珍藏版)》请在三一文库上搜索。
1、中间代码生成,第八章 中间代码生成,中间代码 说明语句的翻译 赋值语句的翻译 控制语句的翻译(if、循环) 属性文法的实现 过程调用的翻译,8.1 中间代码,作用 过渡:经过语义分析被译成中间代码序列 形式 中间语言的语句 优点 便于编译系统的实现、移植、代码优化,常用的中间代码(语言),三地址代码(四元式) 语法(结构)树(三元式)(5.2节) 后缀式逆波兰表示(2.3节) 特点 形式简单、语义明确、便于翻译 独立于目标语言,例 8-1 表达式 (A - 12) * B + 6 的中间代码,+,*,6,-,A,12,B,三地址码 T1=A-12 T2=T1*B T3=T2+6,四元组 (-,
2、 A, 12, T1) (* , T1, B, T2) (+, T2, 6, 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*(-
3、c)+b*(-34)的语法结构树 直观描述,:=,*,-,0,+,*,-,0,id,b,num,34,id,b,id,c,id,a,root,语法结构树 数组存储形式,地址 算符 操作数 操作数 0 1 2 3 4 5 6 7 8 9 10,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 为变量名、常数或编译产生
4、的临时变量 四元式(op, y, z, x),种类:x := y op z 双目运算 x := op y 单目运算 x := y 赋值语句 if x relop y goto l 条件转移语句 (relop,x,y,l),其它语句的三地址代码,goto l 无条件转移 param x 实在参数 call p, n 过程调用 return x 过程返回 x := yi 数组运算 xi := y x := &y 指针运算 x := *y *x = y,生成三地址码的属性文法,8.2 说明语句的翻译,作用 说明语句(Declarations)用于对程序中规定范围内使用的各类变量、常数、过程进行说明
5、编译要完成的工作 在符号表中记录被说明对象的属性,为执行做准备,要关心的问题,类型 基本类型/内部类型(built-in):整型、实型、双精度型、逻辑型、字符型 用户定义类型结构描述 作用域有效范围 一般:说明所在的分程序、过程,要关心的问题,类型的作用 引入数据抽象、隐蔽数据的基本表示 用户无需注明字节数 规定可用的运算 类型检查 数据精度控制 规定存储单元的字节数,优化空间管理,变量说明的翻译,在符号表中填写变量的属性 种别、类型、相对地址、作用域等 相对地址 全局变量表示为静态数据区的偏移值(offset) 局部变量表示为局部数据区(活动记录部分)的偏移值 两种数据区,例 8-3:相对地
6、址举例,名字 相对地址 x 0 i 64 j 68,0 8 56 64 68,begin real x8; integer i, j; end,文法描述,P D D D ; D D id : T T integer T real T arraynum of T1 T T1,例如: a:integer; b:real;c:array10of real,属性、过程、与全局量,文法变量T(类型)的属性 type 类型 width 占用的字节数 基本子程序 enter:设置变量的类型和地址 array:数组类型处理 全局量 offset:已分配空间字节数,说明语句的翻译模式,P offset := 0
7、 D DD ; D Did : T enter( id.name, T.type, offset ); offset := offset + T.width Tinteger T.type := integer; T.width := 4 Treal T.type := real; T.width := 8 Tarray num of T1 T.type := array( num.val, T1.type); T.width := num.val * T1.width TT1 T.type := pointer( T1.type); T.width := 4,PMD M offset :=
8、0 ,例 8-4 x:real; i:integer 的翻译,enter(x,real,0),offset=0,offset=8,T.type=real T.width=8,offset=12,T.type=integer T.width=4,enter(i,integer,8),Did : T enter( id.name, T.type, offset ); offset := offset + T.width,例 8-4 x:real; i:integer 的翻译,Poffset:=0D offset:=0D;D offset:=0x:Tenter(x,T.type,offset);of
9、fset:=offset+T.width;D offset:=0x:realT.type:=real;T.width:=8 enter(x,T.type,offset);offset:=offset+T.width;D x:real(x,real,0);offset:=8;D x:real(x,real,0);offset:=8;i:Tenter(id.name,T.type,offset); offset:=offset+T.width x:real(x,real,0);offset:=8;i:integerT.type:=integer;T.width:=4enter(i,T.type,o
10、ffset);offset:=offset+T.width x:real(x,real,0);i:integer(i,integer,8);offset:=12,作用域信息的保存,所讨论语言的文法 P D S D D ; D | id : T | proc id ; D ; S 语义动作用到的函数 mktable(previous):创建一个新的符号表; enter(table, name, type, offset) addwidth(table, width):符号表的大小; enterproc(table, name, newtable) 在table指向的符号表中为name建立一个新表
11、项;,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 ; D2 D 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.type,top(offse
12、t); top(offset):=top(offset)+ T.width N t := mktable(top(tblptr) ); push(t,tblptr); push(0,offset) ,处理嵌套过程中的说明语句,program sort(input,output); var a:array010 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
13、quicksort(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,tblp
14、tr,top,top,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,r
15、eadarrary,表 头 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,
16、44,a array 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,表 头,空,so
17、rt,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,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,to
18、p,exchange,指向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,表 头,空,sor
19、t,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,8,i integer 0,j integer 4,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,read
20、array,指向readarray,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,表 头
21、8,quicksort,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 i
22、nteger 0,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 end T re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中间 代码 生成
链接地址:https://www.31doc.com/p-3396961.html