编译原理中间代码生成7.ppt
《编译原理中间代码生成7.ppt》由会员分享,可在线阅读,更多相关《编译原理中间代码生成7.ppt(85页珍藏版)》请在三一办公上搜索。
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 中 间 语 言,后缀表示不需要括号(8 4)+2 的后缀表示是8 4 2+,7.1 中 间 语 言,后缀表示不需要括号(8 4)+2 的后缀表示是8 4 2+后缀表示的最大优点是便于计算机处理表达式,7.1 中 间 语 言,后缀表示不需要括号(8 4)+2 的后缀表示是8 4 2+后缀表示的最大优点是便于计算机处理表达式后缀表示很容易拓广到含一元算符的表达式,
3、7.1 中 间 语 言,后缀表示不需要括号(8 4)+2 的后缀表示是8 4 2+后缀表示的最大优点是便于计算机处理表达式后缀表示很容易拓广到含一元算符的表达式 后缀表示也可以拓广到表示赋值语句和控制语句,但很难用栈来描述它的计算,7.1 中 间 语 言,7.1.2 图形表示语法树是一种图形化的中间表示,7.1 中 间 语 言,7.1.2 图形表示语法树是一种图形化的中间表示有向无环图也是一种中间表示,7.1 中 间 语 言,构造赋值语句语法树的语法制导定义,7.1 中 间 语 言,7.1.3 三地址代码一般形式:x=y op z表达式x+y z翻译成的三地址语句序列是t1=y z t2=x+
4、t1,7.1 中 间 语 言,三地址代码是语法树或dag的一种线性表示a=(b+cd)+cd语法树的代码t1=bt2=c dt3=t1+t2t4=c dt5=t3+t4a=t5,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
5、 x 和call p,n过程返回 return y索引赋值x=yi和 xi=y地址和指针赋值x=&y,x=y和x=y,7.1 中 间 语 言,7.1.4 静态单赋值形式一种便于某些代码优化的中间表示和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值三地址代码静态单赋值形式p=a+bp1=a+b q=p cq1=p1 c p=q dp2=q1 d p=e pp3=e p2 q=p+q q2=p3+q1,7.1 中 间 语 言,7.1.4 静态单赋值形式一种便于某些代码优化的中间表示和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值一个变量在不同路径上都定值的解决办法if(
6、flag)x=1;else x=1;y=x a;的条件语句改成if(flag)x1=1;else x2=1;x3=(x1,x2);/由flag的值决定用x1还是x2,7.2 声 明 语 句,为局部名字建立符号表条目为它分配存储单元符号表中包含名字的类型和分配给它的存储单元的相对地址等信息,7.2 声 明 语 句,7.2.1 过程中的声明,7.2 声 明 语 句,计算被声明名字的类型和相对地址P offset=0D;SD D;D D id:Tenter(id.lexeme,T.type,offset);offset=offset+T.width T integer T.type=integer;
7、T.width=4 T real T.type=real;T.width=8 T array num of T1T.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)enter(table,name,type,offset)addWidth(table,width)enterProc(tab
8、le,name,newtable),7.2 声 明 语 句,P M D;S 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);enterProc(top(tblptr),id.lexeme,t)Did:T enter(top(tblptr),id.lexeme,T.type,
9、top(offset);top(offset)=top(offset)+T.width N t=mkTable(top(tblptr);push(t,tblptr);push(0,offset),7.2 声 明 语 句,7.2 声 明 语 句,7.2.3 记录的域名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 符号表
10、的中名字S id:=E p=lookup(id.lexeme);if p!=nil thenemit(p,=,E.place)else error E E1+E2E.place=newTemp();emit(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.lexeme);if p!=nil then E.place=p else error,7.3
11、 赋 值 语 句,7.3.2 数组元素的地址计算一维数组A的第i个元素的地址计算base+(i low)w,7.3 赋 值 语 句,7.3.2 数组元素的地址计算一维数组A的第i个元素的地址计算base+(i low)w 重写成i w+(base low w)减少了运行时的计算,7.3 赋 值 语 句,二维数组A:array1.2,1.3 of T列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3,7.3 赋 值 语 句,二维数组A:array1.2,1.3 of T列为主A1,1,A2,1,A1,2,A2,2,A1,3,A2,3行为主A1,1,A1,2,A1,3,A2,1,A2
12、,2,A2,3,7.3 赋 值 语 句,二维数组A:array1.2,1.3 of T列为主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 赋 值 语 句,二维数组A:array1.2,1.3 of T列为主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)(
13、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.3 数组元素地址计算的翻译方案下标变量访问的产生式L id Elist|idElist 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 i
14、d 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 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=newTe
15、mp();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.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(
16、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(Elist.array),invariant(Elist.array);L.offset=newTemp();emit(L.offset,=,Elist.place,width(Elist.array),7.3 赋 值 语 句,E Lif L.offset=null then/L是简
17、单变量/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=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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 中间 代码 生成

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