编译原理 中间代码生成.ppt

编译原理 中间代码生成.ppt

ID:48091052

大小:403.00 KB

页数:59页

时间:2020-01-11

编译原理 中间代码生成.ppt_第1页
编译原理 中间代码生成.ppt_第2页
编译原理 中间代码生成.ppt_第3页
编译原理 中间代码生成.ppt_第4页
编译原理 中间代码生成.ppt_第5页
资源描述:

《编译原理 中间代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第八章中间代码生成学习内容三地址码表示方法声明语句的翻译赋值语句的翻译:数组寻址布尔表达式的翻译case语句的翻译backpatching技术的实现过程调用的翻译8.1中间语言8.1.1图表示a:=b*-c+b*-c语法树方式表示后缀表示——语法树的线性表示方式abcuminus*bcuminus*+assign语法制导定义构造语法树PRODUCTIONSemanticRuleSid:=E{S.nptr=mknode(‘assign’,mkleaf(id,id.entry),E.nptr)}EE1+E2{E.nptr=mknode(‘+’,E1.nptr,E2.np

2、tr)}EE1*E2{E.nptr=mknode(‘*’,E1.nptr,E2.nptr)}E-E1{E.nptr=mknode(‘uminus’,E1.nptr)}E(E1){E.nptr=E1.nptr}Eid{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:输出一条三地址码指令赋值语句的翻译PRODUCTIONSemanticRuleSid:=E{S.code=E.code

4、

5、gen(id.place‘:=’E.place)

6、}EE1+E2{E.place=newtemp;E.code=E1.code

7、

8、E2.code

9、

10、

11、

12、gen(E.place‘:=’E1.place‘+’E2.place)}EE1*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语句:SwhileEdoS1翻译为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过程内部的声明PRODUCTIONSemanticRulePMD{}M{offset:=0}Did:T{addtype(id.entry,T.type,offset)offset:=offset+T.width}Tchar{T.type=char;T.width=4;}Tinteger{T.type=integer;T.width=4;}Tarray[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作用域的处理处理作用域的翻译模式PMD{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}M{t:=mktable(null);push(t,tblptr);push(0,offset)}DD1;D2Dprocid;ND;S{t:=top(tblpr);addwidth(t,top(offset));pop(tblptr);pop(off

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。