语义分析和中间代码生成.ppt
《语义分析和中间代码生成.ppt》由会员分享,可在线阅读,更多相关《语义分析和中间代码生成.ppt(157页珍藏版)》请在三一办公上搜索。
1、第七章 语义分析和中间代码生成,本章内容介绍几种常用的中间表示:后缀表示、图形表示和三地址代码用语法制导定义和翻译方案的方法来说明程序设计语言的结构怎样被翻译成中间形式,7.1 中 间 语 言,7.1.1 后缀式表达式E的后缀式可以如下递归定义如果E是变量或常数,那么E的后缀式就是E本身。,7.1 中 间 语 言,7.1.1 后缀表示表达式E的后缀表示可以如下递归定义如果E是变量或常数,那么E的后缀表示就是E本身。如果E是形式为E1 opE2的表达式,那么E的后缀式是E1 E2 op,其中E1和E2分别是E1和E2的后缀式。,7.1 中 间 语 言,7.1.1 后缀式表达式E的后缀式可以如下递
2、归定义如果E是变量或常数,那么E的后缀式就是E本身。如果E是形式为E1 opE2的表达式,那么E的后缀式是E1 E2 op,其中E1和E2分别是E1和E2的后缀式。如果E是形式为(E1)的表达式,那么E1的后缀表示也是E的后缀式。,7.1 中 间 语 言,后缀式表示法是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法因此又称逆波兰表示法。这种表示法是把运算量(操作数)写在前面把算符写在后面(后缀)。,7.1 中 间 语 言,把表达式翻译为后缀式的语义规则描述 产 生 式 语 义 规 则EE1op E2 E.code:E1.code|E2.code|opE(E1)Eco
3、de:=E1.codeEid Ecode:id,7.1 中 间 语 言,后缀式不需要括号(8 4)+2 的后缀表示是8 4 2+后缀式的最大优点是便于计算机处理表达式后缀式很容易拓广到含一元算符的表达式 后缀式也可以拓广到表示赋值语句和控制语句,但很难用栈来描述它的计算,7.1 中 间 语 言,图形表示图表示法包括DAG与抽象语法树 语法树是一种图形化的中间表示,7.1 中 间 语 言,图形表示语法树是一种图形化的中间表示有向无环图也是一种中间表示,7.1 中 间 语 言,构造赋值语句语法树的语法制导定义,7.1 中 间 语 言,7.1.3 三地址代码一般形式:x:=y op z表达式x+y
4、z翻译成的三地址语句序列是t1:=y z t2:=x+t1,7.1 中 间 语 言,三地址代码是语法树或DAG的一种线性表示a:=(b+cd)+cd语法树的代码DAG的代码t1:=bt1:=bt2:=c dt2:=c dt3:=t1+t2t3:=t1+t2t4:=c dt4:=t3+t2t5:=t3+t4 a:=t4a:=t5,7.1 中 间 语 言,本书常用的三地址语句赋值语句x:=y op z,x:=op y,x:=y无条件转移goto L条件转移if x relop y goto L过程调用param x 和call p,n过程返回 return y索引赋值x:=yi和 xi:=y地址和
5、指针赋值x:=&y,x:=y和x:=y,T1:y*zT2:xT1,T1:=c T1:=c T2:=b*T1 T2:=b*T1 T3:=c T5:=T2+T4 T4:=b*T3 a:=T5 T5:=T2+T4 a:=T5图7.5相应于图7.3的树和DAG的三地址代码(a)对于抽象语法树的代码;(b)对于DAG的代码,四元式、三元式、间接三元式,三地址语句可看成中间代码的一种抽象形式。编译程序中,三地址代码语句的具体实现可以用记录表示,记录中包含表示运算符和操作数的域。通常有三种表示方法:四元式、三元式、间接三元式。,a:b*cb*c,四元式 三元式 op arg1 arg2 result op
6、arg1 arg2(0)uminus c T1(0)uminus c*b T1 T2(1)*b(0)(2)uminus c T3(2)uminus c(3)*b T3 T4(3)*b(2)(4)+T2 T4 T5(4)+(1)(3)(5):=T5 a(5)assign a(4),7.2 说 明 语 句,为局部名字建立符号表条目为它分配存储单元符号表中包含名字的类型和分配给它的存储单元的相对地址等信息,7.2 说 明 语 句,过程中的声明,7.2 说 明 语 句,计算被声明名字的类型和相对地址P D offset:=0D D;D D id:T enter(id.name,T.type,offse
7、t);offset:=offset+T.width T integer T.type:=integer;T.width:=4 T real T.type:=real;T.width:=8 T array num of T1 T.type:=array(num.val,T1.type);T.width:=num.val T1.widthT T1 T.type:=pointer(T1.type);T.width:=4,7.2 说 明 语 句,7.2.2 作用域信息的保存所讨论语言的文法P D SD D;D|id:T|proc id;D;S 语义动作用到的函数mktable(previous)ent
8、er(table,name,type,offset)addwidth(table,width)enterproc(table,name,newtable),7.2 说 明 语 句,处理嵌套过程中的说明语句P M D addwidth(top(tblptr),top(offset);pop(tblptr);pop(offset)M t:=mktable(nil);push(t,tblprt);push(0,offset)D D1;D2D proc id;N D1;S t:=top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);ent
9、erproc(top(tblptr),id.name,t)Did:T enter(top(tblptr),id.name,T.type,top(offset);top(offset):=top(offset)+T.width N t:=mktable(top(tblptr);push(t,tblptr);push(0,offset),(1)program sort(input,output)(2)var a:array0.10 of integer;(3)x:integer;(4)procedure readarray(5)var i:integer;(6)beginaendreadarray
10、(7)procedure exchange(i,j:integer);(8)begin(9)x:=ai;ai:=aj;aj:=x(10)end exchange;(11)procedure quicksort(m,n;integer);(12)var k,v:integer;(13)function partition(y,z:integer):integer;(14)var i,j:integer;(15)begina(16)v(17)exchange(i,j);(18)end partition;(19)begin end quicksort;(20)beginend sort.,7.2
11、说 明 语 句,7.2 说 明 语 句,记录的域名T record D endT record L D endT.type:=record(top(tblptr);T.width:=top(offset);pop(tblptr);pop(offset)L t:=mktable(nil);push(t,tblprt);push(0,offset),7.3 赋 值 语 句,7.3.1 简单算术表达式及赋值语句S id:=E p:=lookup(id.name);if p nil thenemit(p,:=,E.place)else error E E1+E2E.place:=newtemp;emi
12、t(E.place,:=,E1.place,+,E2.place),7.3 赋 值 语 句,7.3.1 简单算术表达式及赋值语句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,7.3 赋 值 语 句,7.3.2数组元素的地址计算一维数组A的第i个元素的地址计算base+(i low)w,7.3 赋 值 语 句,7.3.3 数组元素的地址计算一维数组A的第i个元素的地址计算
13、base+(i low)w 重写成i w+(base low w),7.3 赋 值 语 句,二维数组列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3,7.3 赋 值 语 句,二维数组列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3行为主A1,1,A1,2,A1,3,A2,1,A2,2,A2,3,7.3 赋 值 语 句,二维数组列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3行为主A1,1,A1,2,A1,3,A2,1,A2,2,A2,3base+(i1 low1)n2+(i2 low2)w(其中n2=high2 low2+1),7.3 赋 值 语
14、 句,二维数组列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3行为主A1,1,A1,2,A1,3,A2,1,A2,2,A2,3base+(i1 low1)n2+(i2 low2)w(其中n2=high2 low2+1)(i1 n2)+i2)w+(base(low1 n2)+low2)w),7.3 赋 值 语 句,多维数组Ai1,i2,.,ik 的地址表达式(i1 n2+i2)n3+i3)nk+ik)w+base(low1 n2+low2)n3+low3)nk+lowk)w,7.3 赋 值 语 句,7.3.4 数组元素地址计算的翻译方案下标变量访问的产生式L id Elist|i
15、dElist Elist,E|E改成L Elist|idElist Elist,E|id E,7.3 赋 值 语 句,所有产生式S L:=EE E+EE(E)E LL Elist L idElist Elist,EElist id E,7.3 赋 值 语 句,L id L.place:=id.place;L.offset:=null,7.3 赋 值 语 句,L id L.place:=id.place;L.offset:=null Elist id E Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place,7.3 赋 值 语 句,L
16、id L.place:=id.place;L.offset:=null Elist id E Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place Elist Elist1,E t:=newtemp;m:=Elist1.ndim+1;emit(t,:=,Elist1.place,limit(Elist1.array,m);emit(t,:=,t,+,E.place);Elist.array:=Elist1.array;Elist.place:=t;Elist.ndim:=m,7.3 赋 值 语 句,L id L.place:=id.p
17、lace;L.offset:=null Elist id E Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place Elist Elist1,E t:=newtemp;m:=Elist1.ndim+1;emit(t,:=,Elist1.place,limit(Elist1.array,m);emit(t,:=,t,+,E.place);Elist.array:=Elist1.array;Elist.place:=t;Elist.ndim:=mL Elist L.place:=newtemp;emit(L.place,:=,base(E
18、list.array),C);/*C=invariant(Elist.array)*/L.offset:=newtemp;emit(L.offset,:=,Elist.place,w),7.3 赋 值 语 句,E L if L.offset=null then/L是简单变量/E.place:=L.place else begin E.place:=newtemp;emit(E.place,:=,L.place,L.offset,)end,7.3 赋 值 语 句,E Lif L.offset=null then/L是简单变量/E.place:=L.place else begin E.place
19、:=newtemp;emit(E.place,:=,L.place,L.offset,)end E E1+E2E.place:=newtemp;emit(E.place,:=,E1.place,+,E2.place),7.3 赋 值 语 句,E Lif L.offset=null then/L是简单变量/E.place:=L.place else begin E.place:=newtemp;emit(E.place,:=,L.place,L.offset,)end E E1+E2E.place:=newtemp;emit(E.place,:=,E1.place,+,E2.place)E(E1
20、)E.place:=E1.place,7.3 赋 值 语 句,E Lif L.offset=null then/L是简单变量/E.place:=L.place else begin E.place:=newtemp;emit(E.place,:=,L.place,L.offset,)end E E1+E2E.place:=newtemp;emit(E.place,:=,E1.place,+,E2.place)E(E1)E.place:=E1.place S L:=Eif L.offset=null then/L是简单变量/emit(L.place,:=,E.place)else emit(L.
21、place,L.offset,:=,E.place),7.3 赋 值 语 句,7.3 赋 值 语 句,t1:=y 20 t1:=t1+z,7.3 赋 值 语 句,t1:=y 20 t1:=t1+z,t2:=A 84 t3:=4 t1,7.3 赋 值 语 句,t1:=y 20 t1:=t1+z,t2:=A 84 t3:=4 t1,t4:=t2 t3,7.3 赋 值 语 句,t1:=y 20 t1:=t1+z,t2:=A 84 t3:=4 t1,t4:=t2 t3,x:=t4,7.3 赋 值 语 句,7.3.5 类型转换x:=y+i j(x和y的类型是real,i和j的类型是integer)中间代
22、码t1:=i int jt2:=inttoreal t1 t3:=y real+t2 x:=t3,7.3 赋 值 语 句,E E1+E2E.place:=newtempif E1.type=integer and E2.type=integer then begin emit(E.place,:=,E1.place,int+,E2.place);E.type=integerendelse if E1.type=integer and E2.type=real then beginu:=newtemp;emit(u,:=,inttoreal,E1.place);emit(E.place,:=,u
23、,real+,E2.place);E.type:=realend.,7.4 布尔表达式的翻译,布尔表达式有两个基本目的计算逻辑值在控制流语句中用作条件表达式,7.4 布尔表达式的翻译,布尔表达式有两个基本目的计算逻辑值在控制流语句中用作条件表达式布尔表达式的完全计算布尔表达式的“短路”计算E1 or E2 定义成 if E1 then true else E2E1 and E2 定义成 if E1 then E2 else false,7.4 布尔表达式的翻译,7.4.1 布尔表达式的翻译E E or E|E and E|not E|(E)|id relop id|true|falsea b的
24、翻译100:if a b goto 103101:t:=0102:goto 104103:t:=1104:,7.4 布尔表达式的翻译,E E1 or E2 E.place:=newtemp;emit(E.place,:=,E1.place,or E2.place)E id1 relop id2E.place:=newtemp;emit(if,id1.place,relop.op,id2.place,goto,nextstat+3);emit(E.place,:=,0);emit(goto,nextstat+2);emit(E.place,:=,1),7.4 布尔表达式的翻译,表达式a b or
25、 c d and e f的代码是:100 if a b goto 103 107 T2:=1101 T1:=0 108 if e f goto 111 102 goto 104 109 T3:=0103 T1:=1 110 goto 112 104 if c d goto 107 111 T3:=1105 T2:=0 112 T4:=T2 and T3 106 goto 108 113 T5:=T1 or T4,7.4 布尔表达式的翻译,E E1 or E2E1.true:=E.true;E1.false:=newlabel;E2.true:=E.true;E2.false:=E.false;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语义 分析 中间 代码 生成
链接地址:https://www.31ppt.com/p-5840303.html