中间代码汇总课件.ppt
《中间代码汇总课件.ppt》由会员分享,可在线阅读,更多相关《中间代码汇总课件.ppt(54页珍藏版)》请在三一办公上搜索。
1、2022/12/6,北京电子科技学院,1,2022/12/6,北京电子科技学院,2,语义分析的工作有:类型检查、控制流检查,一致性检查,作用域分析等。 可以在语法分析的基础上加上语义规则,直接产生机器语言或汇编语言形式的目标代码。但这种编译方式不利于优化和移植,目标代码质量不高。 现在的编译系统,一般都是将源程序先翻译为某种中间代码,然后再将中间代码翻译成目标代码。这样使得编译程序在逻辑结构上更简单,同时也为代码优化和移植创造了条件。,第七章 语义分析及中间代码生成,2022/12/6,北京电子科技学院,3,本章各种语句的代码生成将结合SPL代码生成的方式对照分析,开展课堂讨论。,2022/1
2、2/6,北京电子科技学院,4,中间代码(Intermediate code)是源程序的一种内部表示,不依赖目标机的结构,易于生成。中间代码的几种形式:逆波兰式四元式三元式间接三元式树图。,7.1中间代码,2022/12/6,北京电子科技学院,5,逆波兰式:A B C D - * + E C D -N / +四元式: ( - C D T1) ( * B T1 T2) ( + A T2 T3) ( - C D T4) ( T4 N T5) ( / E T5 T6) ( + T3 T6 T7),例 : A + B * ( C - D ) + E / ( C - D ) N,四元式是一个带有四个域的记
3、录结构,这四个域分别称为: op、arg1, arg2 及result.op代表运算符。语句x:y op z 可表示为(op,y,z,x)。= (op,y,z,T1) (:=,T1, ,x)一目运算符的语句如:x:= -y 或者x:=y 表示为: (,y, ,x) 或(:=,y, ,x)条件和无条件转移语句将目标标号置于result域中。 (j, , ,标号)或(jrop, , ,标号)。,2022/12/6,北京电子科技学院,6,例 : A + B * ( C - D ) + E / ( C - D ) N,三元式: ( - C D ) ( * B (1) ) ( + A (2) ) ( -
4、 C D ) ( (4) N ) ( / E (5) ) ( + (3) (6) ),为了避免把临时变量填入到符号表,可以通过计算这个临时变量值的语句的位置来引用这个临时变量。这样表示三地址代码的记录只需三个域:op 、argl和 arg2,2022/12/6,北京电子科技学院,7,间接三元式:,间接三元式序列:,间接码表:(1)(2)(3)(1)(4)(5)(6),(1) ( - C D ),(2) ( * B (1) ),(3) ( + A (2) ),(4) ( (1) N ),(5) ( / E (4) ),(6) ( + (3) (5 ) ),例 : A + B * ( C - D
5、) + E / ( C - D ) N,为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将按运算的先后顺序列出有关三元式在三元表中的位置。换句话说就是,用一张间接码表辅以三元式表的办法来表示中间代码。这种表示法称为间接三元式。,2022/12/6,北京电子科技学院,8,四元式与三元式和间接三元式作一些比较,四元式之间的联系是通过临时变量实现的。这一点和三元式不同。要更动一张三元表是很困难的,它意味着必须改变其中一系列指示器的值。但要更动四元式表是很容易的,因为调整四元式之间的相对位置并不意味着必须改变其中一系列指示器的值。因此,当需要对中间代码进行优化处理时
6、,四元式比三元式要方便得多。对优化这一点而言,四元式和间接三元式同样方便。,2022/12/6,北京电子科技学院,9,例 : A + B * ( C - D ) + E / ( C - D ) N,2022/12/6,北京电子科技学院,10,DAG图表示:,例 : A + B * ( C - D ) + E / ( C - D ) N,2022/12/6,北京电子科技学院,11,(1)语句:可执行语句:生成四元式不可执行语句(说明语句):填写符号表(2)翻译的要点:确定语句的目标代码结构确定中间代码形式添加语义动作(3)数据结构:符号表、四元式表、临时变量表,7.2语句的翻译,2022/12/
7、6,北京电子科技学院,12,1.简单算术表达式和赋值语句的四元式翻译,文法:Sid:=E EE1+E2 |E1 *E2 |-E1|(E1)|id四元式形式:(op,arg1,arg2,result) result:=arg1 op arg2语义属性:id.name表示id所代表的名字本身 E.place表示存放E值的变量名在符号表的入口或整数码(若此变量是一个临时变量);,2022/12/6,北京电子科技学院,13,函数:newtemp,每次调用它都返回一个代表新临时变量名的整数码,临时变量名按产生的顺序可想象为T1,T2 Tn 。过程:lookup(id.name)检查变量名是否在符号表中。
8、在,则返回地址;否,则返回nil。 emit (op, arg1, arg2, result)将四元式放入中间代码序列中。,2022/12/6,北京电子科技学院,14,例:(1)S id:=E p:=lookup(id.name); if nil then emit(:=, E.place, , p) else error (2) EE1+E2 E.place:= newtemp; emit(+, E1.place, E2.place ,E.place) (3) EE1*E2 E.place:= newtemp; emit(*, E1.place, E2.place ,E.place) (4)
9、 E - E1 E.place:=newtemp; emit(,E1.PLACE, ,E.PLACE) (5) E( E1) E.place:= E1.place (6) Eid E.place:=newtemp; P:=lookup(id.name); if Pnil then E.place:=P else error,2022/12/6,北京电子科技学院,15,输入 栈 PLACE 四元式A:=-B*(C*D):=-B*(C+D) id A-B*(C+D) id:= A_B*(C+D) id:=- A_ _*(C+D) id:=-id A_ _B*(C+D) id:=-E A_ _B (
10、,B,_,T1)*(C+D) id:=E A_T1(C+D) id:=E* A_T1_C+D) id:=E*( A_T1_ _+D) id:=E*(id A_T1_ _C+D) id:=E*(E A_T1_ _CD) id:=E*(E+ A_T1_ _C_) id:=E*(E+id A_T1_ _C_D) id:=E*(E+E A_T1_ _C _D ) id:=E*(E A_T1_ _ T2 (+,C,D,T2) id:=E*(E) A_T1_ _T2 _ id:=E*E A_T1_ T2 (* ,T1,T2,T3) id:=E A_T3 (:=,T3,_,A) S,例:自下而上分析时赋值句
11、的翻译步骤,2022/12/6,北京电子科技学院,16,布尔表达式的基本作用:计算逻辑值用作控制流语句if-then、if-then-else、while-do等之中的条件表达式布尔表达式文法:EE and E|E or E | not E|(E)| i | i rop i rop为关系运算符(),2.布尔表达式的翻译,2022/12/6,北京电子科技学院,17,布尔表达式的翻译:第一种翻译法,如同算术表达式一样,一步不差地从表达式各部分的值计算出整个表达式的值;例: 1 or (not 0 and 0)or 0 =1 or (1 and 0) or 0 =1 or 0 or 0 =1 or
12、0 =1例:A or B and C=D被翻译为如下四元式 OP ARG1 ARG2 RESULT = C D T1 and B T1 T2 or A T2 T3,2022/12/6,北京电子科技学院,18,第二种翻译法:采取某种优化措施。例如,假定要计算A or B,如果计算出A的值为1,B的值就无需再计算了。同理,在计算A and B时,若发现A的值为0,则B的值也无需计算。可以用if-then-else结构来翻译布尔表达式:把 A or B 解释成:if A then true else B把 A and B 解释成:if A then B else false把 not A 解释成:i
13、f A then false else true,2022/12/6,北京电子科技学院,19,布尔表达式的四元式翻译:EE1 or E2 E.place:=newtemp; emit(or, E1.place , E2.place ,E.place )EE1 and E2 E.place:=newtemp; emit(and, E1.place , E2.place ,E.place )Enot E1 E.place:=newtemp; emit(not, E1.place , _ ,E.place )E(E1) E.place:= E1.place,2022/12/6,北京电子科技学院,20
14、,Eid1 rop id2 E.place:=newtemp; emit(jrop, id1.place ,id2.place, nextstat+3 ); emit(:=, 0 , _,E.place); emit(j, _ ,_ , nextstat+2); emit(:=, 1 , _,E.place)Etrue E.place:=newtemp; emit(:= , 1,_ ,E.place)Efalse E.place:=newtemp; emit(:= ,0,_ ,E.place),nextsta为四元式序列号,每生成一条四元式,nextsta便加1。,2022/12/6,北京电子
15、科技学院,21,例:ab or cd and ef的四元式:100: (j,a,b,103)101: (:=,0,_,T1)102: (j ,_,_,104)103: (:=,1,_,T1)104: (j,c,d,107)105: (:=,0,_,T2)106: (j ,_,_,108)107: (:=,1,_,T2)108: (j,e,f,111)109: (:=,0,_,T3)110: (j ,_,_,112)111: (:=,1,_,T3)112: (and,T2,T3 ,T4)113: (or,T1,T4 ,T5),2022/12/6,北京电子科技学院,22,控制语句中布尔表达式的翻译
16、,条件表达式E的作用仅在于控制对S1和S2的选择,只要能完成这一使命,E的值就无须最终保留在某个临时单元之中。因此,作为转移条件的布尔式E,赋予它两种“出口”,一种是“真”出口,转向S1;一是“假”出口,转向S2.,2022/12/6,北京电子科技学院,23,对于转移条件的布尔式 E,翻译成仅含下述三种形式的四元式序列:(jnz,a,_,p) 表示 if a goto p /(p=E.true)(jrop,a,b,p) 表示if a rop b goto p (j,_,_,p) 表示goto p /无条件转向四元式p,2022/12/6,北京电子科技学院,24,例如:可把语句 if A or
17、BD then S1 else S2 翻译成如下的一串四元式:,(1) (jnz,A,_,5) A的真出口为5(2) (j ,_,_,3) A的假出口为3(3) (j ,B,D,5) BD的真出口为5(4) (j,_,_,p+1) BD的假出口为(p+1)(5)(关于S1的四元式序列) (p) (j ,_,_,q) 跳过S2的代码段(p+1)(关于S2的四元式序列) (q),2022/12/6,北京电子科技学院,25,对于E=E1 or E2的形式:如果E1为真,则E为真。即 E1的真出口就是E的真出口;如果E1为假,必须计算E2。E1的假出口是E2的第一个四元式序号,这时E2的真假出口就是E
18、的真假出口。,例:af if af goto E.true(6) goto E.false,E.true, E.false是E的继承属性, E.true是E为真时控制流转向的标号; E.false是E为假时控制流转向的标号,函数newlabel返回新的标号,将放在某个四元式序列号前.,2022/12/6,北京电子科技学院,26,语法制导定义,2022/12/6,北京电子科技学院,27,2022/12/6,北京电子科技学院,28,(接上页),函数gen生成一个四元式, E.code是E的四元式序列。,2022/12/6,北京电子科技学院,29,表达式 ab or cd and ef的中间代码翻译
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中间 代码 汇总 课件

链接地址:https://www.31ppt.com/p-1567596.html