编译 第四章中间代码生成.ppt
《编译 第四章中间代码生成.ppt》由会员分享,可在线阅读,更多相关《编译 第四章中间代码生成.ppt(39页珍藏版)》请在三一办公上搜索。
1、翻译方式有两种:,第四章 中间代码生成,中间代码的特点:结构简单,功能明确,易于优化,易于翻译.,2,第一节 中间代码简介,1)逆波兰表示法 运算量在前,运算符在后的后缀式表示法.例如:表达式后缀式 a+bab+(a+b)*cab+c*a*(b+c)abc+*(a+b)*(c+d)ab+cd+*,3,2)三元式表示法 三元式就是三元组:(操作符,操作数1,操作数2)例如:语句 D:=A+B*C 可翻译为下述三元式表:(1)(*,B,C)(2)(+,A,(1)(3)(:=,D,(2)三元式没有明确指出结果放在何处.,4,3)四元式表示法 四元式就是四元组:(操作符,操作数1,操作数2,结果)例如
2、:语句 D:=A+B*C 可翻译为下述四元式表:(1)(*,B,C,T1)(2)(+,A,T1,T2)(3)(:=,T2,D)四元式间通过临时变量传值.操作符实现的运算也非常简单,本章主要介绍各种语句到四元式的翻译.,5,第二节 语法制导翻译的基本思想,1 何谓语法制导翻译 在语法分析的每次归约或推导时,根据产生式的语义进行翻译的一种方法.翻译时,除了产生中间代码外,还有许多辅助工作,包括:改变语法变量的值;查填符号表;诊查与报告源程序错误等.2 与翻译相关的若干约定 1)临时变量 在翻译中,可能会引入许多临时变量存放中间结果.通过调用 newtemp()返回一个临时变量 Ti.,6,2)分析
3、栈 分析栈中的内容为语法单位,每个语法单位包含两个部分:(语法单位名称,语法单位属性),属性可能有多个值.例如:E 为表达式的语法单位,E.place 代表了该表达式值 存放的地方.3)符号表 符号表用于存放变量及属性值,由如干项构成,每个项为:(变量名,变量信息).4)四元式表 四元式表用于存放翻译中产生的四元 式,通过过程 Gen(操作符,操作数1,操作数2,结果)把四元式存入四元式表的 NXQ 所指 空间中,NXQ 自动加 1.,四元式表,NXQ,7,5 一些基本操作,newtemp()产生一临时变量;gen(操作符,操作数1,操作数2,结果)填入四元式表;fill(i,属性)填入符号表
4、;entry(i)查符号表,返回 i 在符号表中的位置;backpatch(m,n)把 n 填入 四元式表第 m 个四元式中;,8,第三节 简单变量说明语句的翻译,程序设计中,首先应该对程序中使用的变量进行说明.其目的是规定变量所占用空间的大小.编译时,对变量说明语句的翻译工作,本质上就是把变量名及属性登记在符号表中,以便后续工作中使用.pascal 语言的简单变量说明语句为:x,y,z:real;语法可表示为:D NAMELIST:T NAMELIST NAMELIST,i|i T integer|real|boolean|char,该文法代表了所有非结构型变量的说明语句.,9,当然,也可以
5、用如下文法表示:Di:T|i,D T integer|real|boolean|char 我们已经知道用该文法如何分析一个说明语句,下面要解决的是,怎样在分析的过程中,把该语句表达的意思完整的翻译清楚.说明语句的含义是:说明的变量具有给定类型;编译时则翻译为:把每个变量及类型登记在符号表中.语法制导翻译就是为每一条产生式配一个子程序,当用某个产生式归约时,就调用相应的子程序进行适当的翻译工作.这些子程序称为语法单位的语义子程序(或语义动作).,10,下面讨论如下文法的各产生式的语义子程序及翻译过程 Di:T|i,D T integer|real|boolean|char 1)T integer
6、 T.att:=integer;2)T real T.att:=real;3)T boolean T.att:=boolean;4)T char T.att:=char;5)Di:T D.att:=T.att;fill(i,T.att);6)Di:D D.att:=D.att;fill(i,D.att);,11,12,第四节 简单算术表达式 和赋值语句的翻译,简单算术赋值语句的文法可表示为:Si:=EEE+E|E-E|E*E|E/E|(E)|i 该文法为二义文法,但如果规定每个终结符的优先关系,并按优先关系进行归约,则可以避免二义性.赋值语句的含义是:计算出 E 的值,并写入变量 i 中.编译
7、中,并不关心值是多少,而关心的是怎样计算值的过程;也即,哪些变量参加运算,怎样运算?上面文法的各产生式语义子程序如下:,13,Ei E.place:=entry(i)/E.place 表示了表达式E 的值放在什么变量中 E(E1)E.place:=E1.placeE E1+E2 E.place:=newtemp()Gen(+,E1.place,E2.place,E.place)E E1-E2 E.place:=newtemp()Gen(-,E1.place,E2.place,E.place)E E1*E2 E.place:=newtemp()Gen(*,E1.place,E2.place,E.
8、place)E E1/E2 E.place:=newtemp()Gen(/,E1.place,E2.place,E.place)S i:=E Gen(:=,E.place,entry(i)四元式中的操作数及结果,实质上是一指向变量的指针.,14,示例:x:=y+z,x:=y+z,x:=y,x:=E,x:=E+z,x:=E1+E2,E.place=entry(y),E1.place=entry(y);E2.place=entry(z),+z,+z,x:=E,E.place=T1;Gen(+,y,z,T1),S,Gen(:=,T1,x),15,第五节 布尔表达式的翻译,布尔表达式文法可表示为:Bn
9、ot B|B and B|B or B|(B)|i|E ROP E ROP|=|该文法也为二义文法,但如果规定每个终结符的优先关系,并按优先关系进行归约,则可以避免二义性.各产生式语义子程序如下:ROP|=|ROP.val=或=或,16,Bi B.place:=entry(i)/B.place 表示了表达式B 的值放在什么变量中 B(B1)B.place:=B1.placeB not B1 B.place:=newtemp()Gen(not,B1.place,B.place)B B1 and B2 B.place:=newtemp()Gen(and,B1.place,B2.place,B.pl
10、ace)B B1 or B2 B.place:=newtemp()Gen(or,B1.place,B2.place,B.place)B E1 ROP E2 B.place:=newtemp()Gen(ROP.val,E1.place,E2.place,B.place),17,第六节 分支语句的翻译,分支语句包括:ifcase(省略)goto,1 if 语句的翻译 在程序设计种,if 语句可以表示为:if B then S1 else S2;if 语句翻译后,将得到一组四元式,其流程可以表示为:,18,分析是从前向后进行的,按四元式流程的要求,(1)首先归约布尔表达式,产生B的四元式;(2)在归
11、约S1之前,应产生条件转移语句,也即 当归约 if B then 时,产生条件转移语句;由于 S1 S2 还未处理,因此,条件转移语句 的转移地址未知,只有等到S1处理完毕并 产生了无条件转移语句,才能知道条件转 移语句转移的确切地址.(3)归约S1;并在归约 S1 else 时,产生无条件 转移语句;此时,由于S2未处理,无条件转 移语句的转移地址不确定;回填条件转移语句的地址.(4)归约S2;回填无条件转移语句的地址.,*,*,19,从以上分析,可以将文法设计为:STS2 TCS1else Cif B then 语义子程序为:Cif B then C.chain:=NXQ;Gen(Jz,B
12、.place,xxxx)T CS1elseT.chain:=NXQ;Gen(J,xxxx);backpatch(C.chain,NXQ)STS2backpatch(T.chain,NXQ),并设:T C 有属性值 T.chain及C.chain,用于记录条件及无条件转移四元式的序号.,20,示例:if A1 then x:=2 else y:=4,x:=2 else y:=4,C,CS1else,T,TS2,x:=2 else y:=4,y:=4,if B then,四元式序列(1)(,A,1,T1)(2)(Jz,T1,xxxx)(5)(3)(:=,2,x)(4)(J,xxxx)(6)(5)(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 第四章 中间代码生成 第四 中间 代码 生成
链接地址:https://www.31ppt.com/p-2311807.html