资源描述:
《编译原理 中间代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第八章中间代码生成学习内容三地址码表示方法声明语句的翻译赋值语句的翻译:数组寻址布尔表达式的翻译case语句的翻译backpatching技术的实现过程调用的翻译8.1中间语言8.1.1图表示a:=b*-c+b*-c语法树方式表示后缀表示——语法树的线性表示方式abcuminus*bcuminus*+assign语法制导定义构造语法树PRODUCTIONSemanticRuleSid:=E{S.nptr=mknode(‘assign’,mkleaf(id,id.entry),E.nptr)}EE1+E2{E.nptr=mknode(‘+’,E1.nptr,E2.np
2、tr)}EE1*E2{E.nptr=mknode(‘*’,E1.nptr,E2.nptr)}E-E1{E.nptr=mknode(‘uminus’,E1.nptr)}E(E1){E.nptr=E1.nptr}Eid{E.nptr=mkleaf(id,id.entry)}语法树的计算机内部表示8.1.2三地址码Three-AddressCode一般形式:x:=yopz语法树、dag的线性化表示t1:=-ct1:=-ct2:=b*t1t2:=b*t1t3:=-ct5:=t2+t2t4:=b*t3a:=t5t5:=t2+t4a:=t58.1.3三地址码语句类型二元运算
3、:x:=yopz一元运算:x:=opy复制语句:x:=y无条件转移:gotoL条件转移:ifxrelopygotoL函数调用:paramx1paramx2…paramxncallp,n数组:x:=y[i],x[i]:=y指针:x:=&y,x:=*y语法制导翻译生成三地址码赋值语句:id:=E利用属性E.place:保存E的值的名字E.code:计算E的三地址代码newtemp:生成临时变量名gen:输出一条三地址码指令赋值语句的翻译PRODUCTIONSemanticRuleSid:=E{S.code=E.code
4、
5、gen(id.place‘:=’E.place)
6、}EE1+E2{E.place=newtemp;E.code=E1.code
7、
8、E2.code
9、
10、
11、
12、gen(E.place‘:=’E1.place‘+’E2.place)}EE1*E2{E.place=newtemp;E.code=E1.code
13、
14、E2.code
15、
16、
17、
18、gen(E.place‘:=’E1.place‘*’E2.place)}E-E1{E.place=newtemp;E.code=E1.code
19、
20、
21、
22、gen(E.place‘:=’‘uminus’E1.place)}E(E1){E.place=E1.place;E.code=E1.code}E
23、id{E.place=id.entry;E.code=‘’}控制流语句的翻译while语句:SwhileEdoS1翻译为S.begin:E.codeifE.place=0gotoS.afterS1.codegotoS.beginS.after:语法制导定义:S.begin=newlabel;S.after=newlabel;S.code=gen(S.begin‘:’)
24、
25、E.code
26、
27、gen(‘if’E.place‘=’‘0’‘goto’S.after)
28、
29、S1.code
30、
31、gen(‘goto’S.begin)
32、
33、gen(S.after‘:’)8.1.5三地址码的
34、实现四元组,三元组三元运算的实现——拆分x[i]:=yx:=y[i]间接三元组实现方式8.2声明语句的翻译8.2.1过程内部的声明PRODUCTIONSemanticRulePMD{}M{offset:=0}Did:T{addtype(id.entry,T.type,offset)offset:=offset+T.width}Tchar{T.type=char;T.width=4;}Tinteger{T.type=integer;T.width=4;}Tarray[num]ofT1{T.type=array(num.val,T1.type)T.width
35、=num.val*T1.width}T^T1{T.type=pointer(T1.type);T1.width=4}8.2.2作用域的处理处理作用域的翻译模式PMD{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}M{t:=mktable(null);push(t,tblptr);push(0,offset)}DD1;D2Dprocid;ND;S{t:=top(tblpr);addwidth(t,top(offset));pop(tblptr);pop(off