资源描述:
《编译7语义分析和中间代码产生2(zss)-副本》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理(第三版)陈火旺等编著(2012年9月-12月)主讲:朱世松计算机学院三地址语句的种类x:=yopzx:=opyx:=ygotoLifxrelopygotoL或ifagotoLparamx和callp,n,以及返回语句returnyx:=y[i]及x[i]:=y的索引赋值x:=&y,x:=*y和*x:=y的地址和指针赋值7/23/20212生成三地址代码时,临时变量的名字对应抽象语法树的内部结点id:=E对表达式E求值并置于变量T中值id.place:=T7/23/20213从赋值语句生
2、成三地址代码的S-属性文法非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。非终结符号E有如下两个属性:E.place表示存放E值的名字。E.code表示对E求值的三地址语句序列。函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,…。7/23/20214为赋值语句生成三地址代码的S-属性文法定义产生式语义规则S→id:=ES.code:=E.code
3、
4、gen(id.place‘:=’E.place)E→E1+E2E.place:=newtemp
5、;E.code:=E1.code
6、
7、E2.code
8、
9、gen(E.place‘:=’E1.place‘+’E2.place)E→E1*E2E.place:=newtemp;E.code:=E1.code
10、
11、E2.code
12、
13、gen(E.place‘:=’E1.place‘*’E2.place)E→-E1E.place:=newtemp;E.code:=E1.code
14、
15、gen(E.place‘:=’‘uminus’E1.place)E→(E1)E.place:=E1.place;E.code:=
16、E1.codeE→idE.place:=id.place;E.code=‘’7/23/20215三地址语句四元式一个带有四个域的记录结构,这四个域分别称为op,arg1,arg2及resultoparg1arg2result(0)uminuscT1(1)*bT1T2(2)uminuscT3(3)*bT3T4(4)+T2T4T5(5):=T5a7/23/20216三地址语句三元式通过计算临时变量值的语句的位置来引用这个临时变量三个域:op、arg1和arg2oparg1arg2(0)uminusc
17、(1)*b(0)(2)uminusc(3)*b(2)(4)+(1)(3)(5)assigna(4)7/23/20217三地址语句x[i]:=yoparg1arg2(0)[]=xi(1)yx:=y[i]oparg1arg2(0)=[]yi(1)assignx(0)7/23/20218三地址语句间接三元式为了便于优化,用三元式表+间接码表表示中间代码间接码表:一张指示器表,按运算的先后次序列出有关三元式在三元式表中的位置。优点:方便优化,节省空间7/23/20219例如,语句X:=(A+B)*C;Y
18、:=D↑(A+B)的间接三元式表示如下表所示。7/23/202110例:a=A+(-B)*C的三元式:(1)(@,B,-)(2)(*,(1),C)(3)(+,A,(2))7/23/2021117.2说明语句略7/23/2021127.3赋值语句的翻译7.3.1简单算术表达式及赋值语句7/23/202113为赋值语句生成三地址代码的S-属性文法定义产生式语义规则S→id:=ES.code:=E.code
19、
20、gen(id.place‘:=’E.place)E→E1+E2E.place:=newtem
21、p;E.code:=E1.code
22、
23、E2.code
24、
25、gen(E.place‘:=’E1.place‘+’E2.place)E→E1*E2E.place:=newtemp;E.code:=E1.code
26、
27、E2.code
28、
29、gen(E.place‘:=’E1.place‘*’E2.place)E→-E1E.place:=newtemp;E.code:=E1.code
30、
31、gen(E.place‘:=’‘uminus’E1.place)E→(E1)E.place:=E1.place;E.code:
32、=E1.codeE→idE.place:=id.place;E.code=‘’7/23/202114产生赋值语句三地址代码的翻译模式S→id:=E{p:=lookup(id.name);ifpnilthenemit(p‘:=’E.place)elseerror}E→E1+E2{E.place:=newtemp;emit(E.place‘:=’E1.place‘+’E2.place)}E→E1*E2{E.place:=newtemp;emit(E.place‘:=’E1.place‘*’E2.p