编译原理第七章中间代码生成.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 第七 中间 代码 生成
- 资源描述:
-
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,*,第七章 中间代码生成,本章内容,介绍几种常用的中间表示,:,后缀表示、图形表示和三地址代码,用语法制导定义和翻译方案的方法来说明程序设计语言的结构怎样被翻译成中间形式,分析,器,静态,检查,器,中间,代码,生成,器,中间,代码,记号流,代码,生成,器,抽象语法树,后缀式,DAG,图表示,三地址代码(包括三元式、四元式、间接三元式),7.1 中 间 语 言,后缀式,后缀式表示又称逆波兰表示法。,这种表示法是:把运算量(操作数)写在前面,把算符写在后面(后缀)。,一个表达式的后缀形式可以如下定义:,如果,E,是一个变量或常量,则,E,的后缀式是,E,自身,如果,E,是,E,1,op E,2,形式的表达式,这里,op,是任何二元操作符,则,E,的后缀式为,E,1,E,2,op,。这里,E,1,和,E,2,分别是,E,1,和,E,2,的后缀式。,如果,E,是,(E,1,),形式的表达式,则,E,1,的后缀式就是,E,的后缀式,只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都能对它正确的进行唯一分解,后缀式,表达式翻译为后缀式的语义规则描述:,其中,E.code,表示,E,的后缀式,,op,表示任何二元操作符,“,|”,表示后缀形式的连接,产生式,语义规则,E,E,1,op E,2,E.code,=E,1,.code|E,2,.code|op,E,(,E,1,),E.code,=E,1,.code,E,id,E.code,=id,图表示法,图表示法主要包括,DAG(Directed Acyclic Graph),与抽象语法树,语法树描述了源程序的自然层次结构。,DAG,以更紧凑的形式给出了相同的信息。两者不同的是:,在一个,DAG,中代表公共子表达式的结点具有多个父结点,在一颗抽象语法树中公共子表达式被表示为重复的子树。,assign,+,a,*,*,uminus,b,c,uminus,b,c,a=b*-c+b*-c,assign,+,a,*,uminus,b,c,abc,uminus,*,bc,numinus,*+assign,抽象语法树,构造赋值语句语法树的语法制导定义:,如果函数,mknode(op,child),和,mknode(op,left,right),尽可能返回一个指向已经存在结点的指针以代替建立新的结点,那么就会生成,DAG,图。,产生式,语义规则,Sid,=E,S.nptr,=,mknode(assign,mkleaf(id,id.place,),E.nptr,),EE,1,+E,2,E.nptr,=,mknode,(+,E,1,.nptr,E,2,.nptr),EE,1,*E,2,E.nptr,=,mknode,(*,E,1,.nptr,E,2,.nptr),E-E,1,E.nptr,=,mknode(uminus,E,1,.nptr),E(E,1,),E.nptr,=,E,1,.nptr,Eid,E.nptr,=,mkleaf(id,id.place,),抽象语法树的表示形式,assign,id,a,+,*,*,uminus,uminus,id,b,id,b,id,c,id,c,0,id,b,1,id,c,2,uminus,1,3,*,0,2,4,id,b,5,id,c,6,uminus,5,7,*,4,6,8,+,3,7,9,id,a,10,assign,9,8,11,a=b*-c+b*-c,三地址代码,三地址代码是下列形式的语句序列,x=y op z,其中,,x,、,y,和,z,是名字,常量或编译器生成的临时变量,op,代表任何操作符(定点运算符、浮点运算符、逻辑运算符等),像,x+y,*z,这样的表达式要翻译为,:,T,1,=y*z,T,2,=x+T,1,其中,T,1,,,T,2,为编译时产生的临时变量。,三地址语句的类型,三地址语句类似于汇编语言代码。语句可以有符号标号,而且存在各种控制流语句。,本书中使用的三地址语句:,形如,x=y op z,的赋值语句,其中,op,为二元算术算符或逻辑算符,形如,x=op y,的赋值语句,其中,op,为一元算符。,形如,x=y,的赋值语句,将,y,的值赋给,x,形如,goto,L,的无条件跳转语句,即下一条将被执行的语句是带有标号,L,的三地址语句,三地址语句的类型,形如,if x,relop,y,goto,L,或,if a,goto,L,的条件跳转语句。,第一种形式使用关系运算符号,relop,(,等),第二种,a,为布尔变量或常量,用于过程调用的语句,param,x,和,call p,n,,以及返回语句,return y,。源程序中的过程调用,p(x,1,x,2,x,n,),:,param,x,1,param,x,2,param,x,2,call p,n n,表示实参个数。,return y,中,y,为过程返回的一个值,形如,x=,yi,及,xi,=y,的索引赋值。,形如,x=&y,x=*y,和*,x=y,的地址和指针赋值。,三地址语句的实现,三地址语句是中间代码的一种抽象形式。,这些语句可以以带有操作符和操作数域的记录来实现。四元式、三元式及间接三元式是三种这样的表示。,四元式,一个四元式是带有四个域的记录结构,这四个域分别称为,op,arg1,arg2,及,result,。,域,op,包含一个代表运算符的内部码,三地址语句,x=y op z,通过将,y,放入,arg1,,,z,放入,arg2,,并且将,x,放入,result,,,=,为算符。,像,x=y,或,x=-y,这样的一元操作符语句不使用,arg2,像,param,这样的运算符仅使用,arg1,域。,条件和无条件语句将目标标号存入,result,域。,临时变量也要填入符号表中。,三元式,为了避免把临时变量填入符号表,可以通过计算临时值语句的位置来引用该临时变量。,这样三地址代码的记录只需要三个域,op,arg1,和,arg,。,对于单目运算符,op,arg1,和,arg2,只需用其一。,四元式,/,三元式,举例,op,arg1,arg2,result,(0),uminus,c,T,1,(1),*,b,T,1,T,2,(2),uminus,c,T,3,(3),*,b,T,3,T,4,(4),+,T,2,T,4,T,5,(5),assign,T,5,a,op,arg1,arg2,(0),uminus,c,(1),*,b,(0),(2),uminus,c,(3),*,b,(2),(4),+,(1),(3),(5),assign,a,(4),a=b*-c+b*-c,三元式,三元式举例,op,arg1,arg2,(0),=,x,i,(1),assign,(0),y,op,arg1,arg2,(0),=,y,i,(1),assign,x,(0),xi,=y,x=,yi,间接三元式,为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将运算的先后顺序列出有关三元式在三元表中的位置。,即,用一张间接码表辅以三元式表来表示中间代码。这种表示方法称为间接三元式。,间接三元式举例,X=(A+B)*C Y=D(A+B),op,arg1,arg2,(1),+,A,B,(2),*,(1),C,(3),=,X,(2),(4),D,(1),(5),=,Y,(4),间接代码,(1)(2)(3)(1)(4)(5),当在代码优化过程中需要调整运算顺序时,只需重新安排间接码表,无需改动三元式表,对于间接三元式表示,语义规则中应增添产生间接码表的动作,并且在向三元式表填进一个三元式之前,必须先查看一下此式是否已在其中,就无须填入。,7.2,声 明 语 句,为局部名字建立符号表条目,为它分配存储单元,符号表中包含名字的类型和分配给它的存储单元的相对地址等信息,7.2,声 明 语 句,7.2.1,过程中的声明,计算被声明名字的类型和相对地址,P,offset,=0,D S,D,D,;,D,D,id:,T,enter,(id.,name,T,.,type,offset,);,offset,=,offset,+,T,.,width,T,integer,T,.,type,=,integer,;,T,.,width,=4,T,real ,T,.,type,=,real,;,T,.,width,=8,T,array num of,T,1,T,.,type,=,array,(,num.,val,T,1,.,type,);,T,.width=,num.,val,T,1,.width,T,T,1,T,.,type,=,pointer,(,T,1,.,type,);,T,.,width,=4,7.2,声 明 语 句,7.2.2,作用域信息的保存,所讨论语言的文法,P,D S,D,D,;,D|,id:,T|,proc id;,D,;,S,语义动作用到的函数,mktable,(,previous,),enter,(,table,name,type,offset,),addwidth,(,table,width,),enterproc,(,table,name,newtable,),7.2,声 明 语 句,P,M D S,addwidth,(,top,(,tblptr,),top,(,offset,);,pop,(,tblptr,);,pop,(,offset,),M,t,=,mktable,(,nil,);,push,(,t,tblptr,);,push,(0,offset,),D,D,1,;,D,2,D,proc id;,N D,1,;,S,t,=,top,(,tblptr,);,addwidth,(,t,top,(,offset,);,pop,(,tblptr,);,pop,(,offset,);,enterproc,(,top,(,tblptr,),id.,name,t,),D,id:,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,),*7.3,赋 值 语 句,7.3.1,符号表中的名字,S,id=,E,p,=,lookup,(id.,name,);,if,p,nil,then,emit,(,p,=,E,.,place,),else,error,E,E,1,+,E,2,E,.,place,=,newtemp,;,emit,(,E,.,place,=,E,1,.,place,+,E,2,.,place,),E,E,1,E,.,place,=,newtemp,;,emit,(,E,.,place,=,uminus,E,1,.,place,),E,(,E,1,),E,.,place,=,E,1,.,place,E,id ,p,=,lookup,(id.,name,);,if,p,nil,then,E,.,place,=,p,else,error,7.3,赋 值 语 句,7.3.2 临时名字的重新使用,大量临时变量的使用对优化有利,大量临时变量会增加符号表管理的负担,也会增加运行时临时数据占的空间,7.3,赋 值 语 句,7.3.3 数组元素的地址计算,一维数组,A,的第,i,个元素的地址计算,base,+(,i,low,),w,7.3,赋 值 语 句,7.3.3 数组元素的地址计算,一维数组,A,的第,i,个元素的地址计算,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,3,base,+(,i,1,low,1,),n,2,+(,i,2,low,2,),w,(,其中,n,2,=,high,2,low,2,+1),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,base,+(,i,1,low,1,),n,2,+(,i,2,low,2,),w,(,其中,n,2,=,high,2,low,2,+1),(,i,1,n,2,)+,i,2,),w,+,(,base,(,low,1,n,2,)+,low,2,),w,),7.3,赋 值 语 句,多维数组,A,i,1,i,2,.,i,k,的地址表达式,(,i,1,n,2,+,i,2,),n,3,+,i,3,),n,k,+,i,k,),w,+,base,(,low,1,n,2,+,low,2,),n,3,+,low,3,),n,k,+,low,k,),w,7.3,赋 值 语 句,7.3.4,数组元素地址计算的翻译方案,下标变量访问的产生式,L,id,Elist,|id,Elist,Elist,E,|,E,改成,L,Elist,|id,Elist,Elist,E,|id,E,7.3,赋 值 语 句,所有产生式,S,L,=,E,E,E,+,E,E,(,E,),E,L,L,Elist,L,id,Elist,Elist,E,Elist,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,id,L,.,place,=id.,place,;,L,.,offset,=null,Elist,id,E,Elist,.,place,=,E,.,place,;,Elist,.,ndim,=1;,Elist,.,array,=id.,place,Elist,Elist,1,E,t,=,newtemp,;,m,=,Elist,1,.,ndim,+1;,emit,(,t,=,Elist,1,.,place,limit,(,Elist,1,.,array,m,);,emit,(,t,=,t,+,E,.,place,);,Elist,.,array,=,Elist,1,.,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,Elist,1,E,t,=,newtemp,;,m,=,Elist,1,.,ndim,+1;,emit,(,t,=,Elist,1,.,place,limit,(,Elist,1,.,array,m,);,emit,(,t,=,t,+,E,.,place,);,Elist,.,array,=,Elist,1,.,array,;,Elist,.,place,=,t,;,Elist,.,ndim,=,m,L,Elist,L,.,place,=,newtemp,;,emit,(,L,.,place,=,base,(,Elist,.,array,),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,L,if,L,.,offset,=null then/,L,是简单变量,/,E,.,place,=,L,.,place,else begin,E,.,place,=,newtemp,;,emit,(,E,.,place,=,L,.,place,L,.,offset,)end,E,E,1,+,E,2,E,.,place,=,newtemp,;,emit,(,E,.,place,=,E,1,.,place,+,E,2,.,place,),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,E,E,1,+,E,2,E,.,place,=,newtemp,;,emit,(,E,.,place,=,E,1,.,place,+,E,2,.,place,),E,(,E,1,),E,.,place,=,E,1,.,place,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,E,E,1,+,E,2,E,.,place,=,newtemp,;,emit,(,E,.,place,=,E,1,.,place,+,E,2,.,place,),E,(,E,1,),E,.,place,=,E,1,.,place,S,L,=,E,if,L,.,offset,=null then/,L,是简单变量,/,emit,(,L,.,place,=,E,.place),else,emit,(,L,.,place,L,.,offset,=,E,.,place,),7.3,赋 值 语 句,S,=,L,.,place,=x,L,.,offset,=null,x,E,.,place,=t,4,L,.,place,=t,2,L,.,offset,=t,3,Elist,.,place,=t,1,Elist,.,ndim,=2,Elist,.,array,=A,Elist,.,place,=y,Elist,.,ndim,=1,Elist,.,array,=A,E,.,place,=z,L,.,place,=z,L,.,offset,=null,E,.,place,=y,L,.,place,=y,L,.,offset,=null,A,z,y,x=A y,z,的注释分析树,7.3,赋 值 语 句,S,=,L,.,place,=x,L,.,offset,=null,x,E,.,place,=t,4,L,.,place,=t,2,L,.,offset,=t,3,Elist,.,place,=t,1,Elist,.,ndim,=2,Elist,.,array,=A,Elist,.,place,=y,Elist,.,ndim,=1,Elist,.,array,=A,E,.,place,=z,L,.,place,=z,L,.,offset,=null,E,.,place,=y,L,.,place,=y,L,.,offset,=null,A,z,y,x=A y,z,的注释分析树,t,1,=y,20,t,1,=t,1,+z,7.3,赋 值 语 句,S,=,L,.,place,=x,L,.,offset,=null,x,E,.,place,=t,4,L,.,place,=t,2,L,.,offset,=t,3,Elist,.,place,=t,1,Elist,.,ndim,=2,Elist,.,array,=A,Elist,.,place,=y,Elist,.,ndim,=1,Elist,.,array,=A,E,.,place,=z,L,.,place,=z,L,.,offset,=null,E,.,place,=y,L,.,place,=y,L,.,offset,=null,A,z,y,x=A y,z,的注释分析树,t,1,=y,20,t,1,=t,1,+z,t,2,=A,84,t,3,=4,t,1,7.3,赋 值 语 句,S,=,L,.,place,=x,L,.,offset,=null,x,E,.,place,=t,4,L,.,place,=t,2,L,.,offset,=t,3,Elist,.,place,=t,1,Elist,.,ndim,=2,Elist,.,array,=A,Elist,.,place,=y,Elist,.,ndim,=1,Elist,.,array,=A,E,.,place,=z,L,.,place,=z,L,.,offset,=null,E,.,place,=y,L,.,place,=y,L,.,offset,=null,A,z,y,x=A y,z,的注释分析树,t,1,=y,20,t,1,=t,1,+z,t,2,=A,84,t,3,=4,t,1,t,4,=t,2,t,3,7.3,赋 值 语 句,S,=,L,.,place,=x,L,.,offset,=null,x,E,.,place,=t,4,L,.,place,=t,2,L,.,offset,=t,3,Elist,.,place,=t,1,Elist,.,ndim,=2,Elist,.,array,=A,Elist,.,place,=y,Elist,.,ndim,=1,Elist,.,array,=A,E,.,place,=z,L,.,place,=z,L,.,offset,=null,E,.,place,=y,L,.,place,=y,L,.,offset,=null,A,z,y,x=A y,z,的注释分析树,t,1,=y,20,t,1,=t,1,+z,t,2,=A,84,t,3,=4,t,1,t,4,=t,2,t,3,x=t,4,7.4,布尔表达式和控制流语句,布尔表达式有两个基本目的,计算逻辑值,在控制流语句中用作条件表达式,7.4,布尔表达式和控制流语句,布尔表达式有两个基本目的,计算逻辑值,在控制流语句中用作条件表达式,布尔表达式的完全计算,布尔表达式的,“,短路”计算,B,1,or,B,2,定义成,if,B,1,then true else,B,2,B,1,and,B,2,定义成,if,B,1,then,B,2,else false,7.4,布尔表达式和控制流语句,7.4.1,布尔表达式的翻译,B,B,or,B,|,B,and,B,|not,B,|(,B,),|id,relop,id|true|false,a b,的翻译,100:,if a b,goto,103,101:t=0,102:,goto,104,103:t=1,104:,7.4,布尔表达式和控制流语句,B,B,1,or,B,2,B,.,place,=,newtemp,;,emit,(,B,.,place,=,B,1,.,place,or,B,2,.,place,),B,id,1,relop,id,2,B,.,place,=,newtemp,;,emit,(if,id,1,.,place,relop.,op,id,2,.,place,goto,nextstat,+3);,emit,(,B,.,place,=,0);,emit,(,goto,nextstat,+2);,emit,(,B,.,place,=,1),7.4,布尔表达式和控制流语句,7.4.2,控制流语句的翻译,S,if,B,then,S,1,|,if,B,then,S,1,else,S,2,|,while,B,do,S,1,|S,1,;,S,2,7.4,布尔表达式和控制流语句,B,.,code,S,1,.,code,B,.,true,:,.,指向,B,.,true,指向,B,.,false,(,a)if-then,B,.,code,S,1,.,code,B,.,true,:,.,指向,B,.,true,指向,B,.,false,B,.,false,:,goto,S,.,next,S,2,.,code,(,b)if-then-else,B,.,code,S,1,.,code,B,.,true,:,.,指向,B,.,true,指向,B,.,false,goto,S,.,begin,S,.,begin,:,(,c)while-do,S,1,.,code,S,2,.,code,S,1,.,next,:,.,(,d),S,1,;,S,2,7.4,布尔表达式和控制流语句,S,if,B,then,S,1,B,.,true,=,newlabel,;,B,.,false,=,S,.,next,;,S,1,.,next,=,S,.,next,;,S,.,code,=,B,.,code,|,gen,(,B,.,true,:)|,S,1,.,code,B.code,S,1,.,code,B.true,:,.,指向,B.true,指向,B.false,(,a)if-then,7.4,布尔表达式和控制流语句,S,if,B,then,S,1,else,S,2,B.true,=,newlabel,;,B.false,=,newlabel,;,S,1,.,next,=,S,.,next,;,S,2,.,next,=,S,.,next,;,S,.,code,=,B.code,|,gen,(,B.true,:)|,S,1,.,code,|,gen,(goto,S,.,next,)|,gen,(,B.false,:)|,S,2,.,code,B.code,S,1,.,code,B.true,:,.,指向,B.true,指向,B.false,B.false,:,goto,S,.,next,S,2,.,code,(,b)if-then-else,7.4,布尔表达式和控制流语句,S,while,B,do,S,1,S,.,begin,=,newlabel,;,B.true,=,newlabel,;,B.false,=,S,.,next,;,S,1,.,next,=,S,.,begin,;,S,.,code,=,gen,(,S,.,begin,:)|,B.code,|,gen,(,B.true,:)|,S,1,.,code,|,gen,(goto,S,.,begin,),B.code,S,1,.,code,B.true,:,.,指向,B.true,指向,B.false,goto,S,.,begin,S,.,begin,:,(,c)while-do,7.4,布尔表达式和控制流语句,S,S,1,;,S,2,S,.,code,=,S,1,.,code,|,gen,(,S,1,.,next,:)|,S,2,.,code,S,1,.,code,S,2,.,code,S,1,.,next,:,.,(,d),S,1,;,S,2,7.4,布尔表达式和控制流语句,7.4.3,布尔表达式的控制流翻译,如果,B,是,a,b,的形式,,那么代码是:,if,a,b,goto,B.true,goto,B.false,7.4,布尔表达式和控制流语句,表达式,a,b,or,c,d,and,e,f,的代码是:,if,a,b,goto,L,true,goto,L,1,L,1,:if,c,d,goto,L,2,goto,L,false,L,2,:if,e,f,goto,L,true,goto,L,false,7.4,布尔表达式和控制流语句,B,B,1,or,B,2,B,1,.,true,=,B.true,;,B,1,.,false,=,newlabel,;,B,2,.,true,=,B.true,;,B,2,.,false,=,B.false,;,B.code,=,B,1,.,code,|,gen,(,B,1,.,false,:)|,B,2,.,code,7.4,布尔表达式和控制流语句,B,B,1,or,B,2,B,1,.,true,=,B.true,;,B,1,.,false,=,newlabel,;,B,2,.,true,=,B.true,;,B,2,.,false,=,B.false,;,B.code,=,B,1,.,code,|,gen,(,B,1,.,false,:)|,B,2,.,code,B,not,B,1,B,1,.,true,=,B.false,;,B,1,.,false,=,B.true,;,B.code,=,B,1,.,code,7.4,布尔表达式和控制流语句,B,B,1,and,B,2,B,1,.,true,=,newlabel,;,B,1,.,false,=,B.false,;,B,2,.,true,=,B.true,;,B,2,.,false,=,B.false,;,B.code,=,B,1,.,code,|,gen,(,B,1,.,true,:)|,B,2,.,code,7.4,布尔表达式和控制流语句,B,B,1,and,B,2,B,1,.,true,=,newlabel,;,B,1,.,false,=,B.false,;,B,2,.,true,=,B.true,;,B,2,.,false,=,B.false,;,B.code,=,B,1,.,code,|,gen,(,B,1,.,true,:)|,B,2,.,code,B,(,B,1,),B,1,.,true,=,B.true,;,B,1,.,false,=,B.false,;,B.code,=,B,1,.,code,7.4,布尔表达式和控制流语句,B,id,1,relop,id,2,B.code,=,gen,(if,id,1,.,place,relop.,op,id,2,.,place,goto,B.true,)|,gen,(goto,B.false,),7.4,布尔表达式和控制流语句,B,id,1,relop,id,2,B.code,=,gen,(if,id,1,.,place,relop.,op,id,2,.,place,goto,B.true,)|,gen,(goto,B.false,),B,true,B.code,=,gen,(goto,B.true,),B,false,B.code,=,gen,(goto,B.false,),布尔表达式的语法制导定义,B,B,1,or,B,2,B,1,.,true,=,B,.,true,;,B,1,.,false,=,newlabel,;,B,2,.,true,=,B,.,true,;,B,2,.,false,=,B,.,false,;,B,.,code,=,B,1,.,code,|,gen,(,B,1,.,false,:)|,B,2,.,code,B,not,B,1,B,1,.,true,=,B,.,false,;,B,1,.,false,=,B,.,true,;,B,.,code,=,B,1,.,code,B,B,1,and,B,2,B,1,.,true,=,newlabel,;,B,1,.,false,=,B,.,false,;,B,2,.,true,=,B,.,true,;,B,2,.,false,=,B,.,false,;,B,.,code,=,B,1,.,code,|,gen,(,B,1,.,true,:)|,B,2,.,code,B,(,B,1,),B,1,.,true,=,B,.,true,;,B,1,.,false,=,B,.,false,;,B,.,code,=,B,1,.,code,B,id,1,relop,id,2,B,.,code,=,gen,(if,id,1,.,place,relop.,op,id,2,.,place,goto,B,.,true,),|,gen,(goto,B,.,false,),B,true,B,.,code,=,gen,(goto,B,.,true,),B,false,B,.,code,=,gen,(goto,B,.,false,),控制流语句的语法制导定义,S,if,B,then S,1,B,.,true,=,newLabel,;,B,.,false,=,S.next,;,S,1,.next=,S.next,;,S.,code,=,B,.,code,|,gen,(,B,.true,:)|,S,1,.,code,S,if,B,then,S,1,else,S,2,B.true,=,newlabel,;,B.false,=,newlabel,;,S,1,.,next,=,S,.,next,;,S,2,.,next,=,S,.,next,;,S,.,code,=,B.code,|,gen,(,B.true,:)|,S,1,.,code,|,gen,(goto,S,.,next,)|,gen,(,B.false,:)|,S,2,.,code,S,while,B,do,S,1,S,.,begin,=,newlabel,;,B.true,=,newlabel,;,B.false,=,S,.,next,;,S,1,.,next,=,S,.,begin,;,S,.,code,=,gen,(,S,.,begin,:)|,B.code,|,gen,(,B.true,:)|,S,1,.,code,|,gen,(goto,S,.,begin,S,S,1,;,S,2,S,.,code,=,S,1,.,code,|,gen,(,S,1,.,next,:)|,S,2,.,code,例 考虑语句,while ab do,if cd then,x=,y+z,else,x=,y-z,7.4,布尔表达式和控制流语句,7.4.4,开关语句的翻译,switch,E,begin,case,V,1,:,S,1,case,V,2,:,S,2,.,case,V,n,-1,:,S,n,1,default:,S,n,end,7.4,布尔表达式和控制流语句,分支数较少时,t=,E,的代码|,L,n,-2,:if t,!=,V,n,-1,goto,L,n,-1,if t,!=,V,1,goto,L,1,|,S,n,-1,的代码,S,1,的代码|,goto,next,goto,next|L,n,-1,:,S,n,的代码,L,1,:if t,!=,V,2,goto,L,2,|next:,S,2,的代码,goto,next,L,2,:.,.,7.4,布尔表达式和控制流语句,分支较多时,将分支测试代码集中在一起,便于生成较好的分支测试代码,t=,E,的代码|,L,n,:,S,n,的代码,goto,test,|,goto,next,L,1,:,S,1,的代码,|,test:if t=,V,1,goto,L,1,goto,next|if t=,V,2,goto,L,2,L,2,展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


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
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/14746986.html