




已阅读5页,还剩121页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理,第七章语义分析和中间代码产生,源程序,词法分析器,错误处理器,符号管理表,语法分析器,语义分析器,中间代码生成器,代码优化器,代码生成器,第七章语义分析和中间代码产生,中间语言赋值语句的翻译布尔表达式的翻译控制语句的翻译过程调用的处理,第七章语义分析和中间代码产生,静态语义检查类型检查控制流检查一致性检查相关名字检查名字的作用域分析,第七章语义分析和中间代码产生,静态语义检查和中间代码产生在编译程序中的地位:,语法分析器,中间代码产生器,静态检查器,中间代码,优化器,中间语言独立于机器复杂性界于源语言和目标语言之间引入中间语言的好处:便于进行与机器无关的代码优化工作易于移植使编译程序的结构在逻辑上更为简单明确,源语言程序,目标语言程序,中间语言程序,常用的中间语言:后缀式,又叫逆波兰表示图表示:DAG图、抽象语法树三地址代码三元式四元式间接三元式,7.1中间语言,7.1.1后缀式,后缀式表示法:Lukasiewicz发明的一种表示表达式的方法,又称逆波兰表示法。一个表达式E的后缀形式可以如下定义:1.如果E是一个变量或常量,则E的后缀式是E自身。2.如果E是E1opE2形式的表达式,其中op是任何二元操作符,则E的后缀式为E1E2op,其中E1和E2分别为E1和E2的后缀式。3.如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。,逆波兰表示法不用括号。只要知道每个算符的目数,对于后缀式,不论从哪一端进行扫描,都能对它进行唯一分解。后缀式的计算用一个栈实现。一般的计算过程是:自左至右扫描后缀式,每碰到运算量就把它推进栈。每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。,把表达式翻译成后缀式的语义规则描述,产生式EE(1)opE(2)E(E(1)Eid,语义规则E.code:=E(1).code|E(2).code|opE.code:=E(1).codeE.code:=id,E.code表示E后缀形式op表示任意二元操作符“|”表示后缀形式的连接。,7.1.2图表示法,图表示法DAG抽象语法树,7.1.2图表示法,无循环有向图(DirectedAcyclicGraph,简称DAG)对表达式中的每个子表达式,DAG中都有一个结点一个内部结点代表一个操作符,它的孩子代表操作数在一个DAG中代表公共子表达式的结点具有多个父结点,a+a*(b-c)+(b-c)*d的DAG,*,-,c,a有两个父结点(+,*);表达式b-c也有两个父结点;,a:=b*(-c)+b*(-c)的图表示法,抽象语法树对应的代码:T1:=-cT2:=b*T1T3:=-cT4:=b*T3T5:=T2+T4a:=T5,a:=b*(-c)+b*(-c)的抽象语法树对应的代码,DAG对应的代码:T1:=-cT2:=b*T1T5:=T2+T2a:=T5,a:=b*(-c)+b*(-c)的DAG对应的代码,抽象语法树对应的代码:T1:=-cT2:=b*T1T3:=-cT4:=b*T3T5:=T2+T4a:=T5,7.1.3三地址代码,三地址代码x:=yopz/*每个语句的右边只能有一个运算符*/三地址代码可以看成是抽象语法树或DAG的一种线性表示,a:=b*(-c)+b*(-c)的图表示法,相应于a:=b*(-c)+b*(-c)抽象语法树与DAG的三地址码,T1:=-cT1:=-cT2:=b*T1T2:=b*T1T3:=-cT5:=T2+T2T4:=b*T3a:=T5T5:=T2+T4a:=T5对于抽象语法树的代码对于DAG的代码,三地址语句的种类,x:=yopzx:=opyx:=ygotoLifxrelopygotoL或ifagotoL传参paramx和转子callp,n,以及返回语句returnyx:=yi及xi:=y的索引赋值x:=Y:=D(A+B)的间接三元式表示如下表所示。,语句的移动仅改变左边的间接代码表,小结,常用的中间语言后缀式,逆波兰表示图表示:DAG,抽象语法树三地址代码:三元式、四元式、间接三元式,第七章语义分析和中间代码产生,中间语言赋值语句的翻译布尔表达式的翻译控制语句的翻译过程调用的处理,赋值语句的翻译,1.简单算术表达式及赋值语句id:=E对表达式E求值并置于变量T中id.place=T,从赋值语句生成三地址代码的S-属性文法,非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。非终结符号E有如下两个属性:E.place表示存放E值的单元的名字。E.code表示对E求值的三地址语句序列。函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,。,为赋值语句生成三地址代码的S-属性文法定义,产生式语义规则Sid:=ES.code:=E.code|gen(id.place:=E.place)EE1+E2E.place:=newtemp;E.code:=E1.code|E2.code|gen(E.place:=E1.place+E2.place)EE1*E2E.place:=newtemp;E.code:=E1.code|E2.code|gen(E.place:=E1.place*E2.place)E-E1E.place:=newtemp;E.code:=E1.code|gen(E.place:=uminusE1.place)E(E1)E.place:=E1.place;E.code:=E1.codeEidE.place:=id.place;E.code=,产生赋值语句三地址代码的翻译模式,Sid:=Ep:=lookup();ifpnilthenemit(p:=E.place)elseerrorEE1+E2E.place:=newtemp;emit(E.place:=E1.place+E2.place)EE1*E2E.place:=newtemp;emit(E.place:=E1.place*E2.place),Sid:=ES.code:=E.code|gen(id.place:=E.place)EE1+E2E.place:=newtemp;E.code:=E1.code|E2.code|gen(E.place:=E1.place+E2.place)EE1*E2E.place:=newtemp;E.code:=E1.code|E2.code|gen(E.place:=E1.place*E2.place),产生赋值语句三地址代码的翻译模式,E-E1E.place:=newtemp;emit(E.place:=uminusE1.place)E(E1)E.place:=E1.placeEidp:=lookup();ifpnilthenE.place:=pelseerror,E-E1E.place:=newtemp;E.code:=E1.code|gen(E.place:=uminusE1.place)E(E1)E.place:=E1.place;E.code:=E1.codeEidE.place:=id.place;E.code=,2.数组元素的引用,数组元素地址的计算:X:=Ai1,i2,,ik+YAi1,i2,,ik=X+Y,赋值语句的翻译,数组元素地址计算,设A为1维数组,每个元素宽度为w,low为下界,base为A的第一个元素;则A(i)这个元素的相对地址为:base+(i-low)w上式可整理为:iw+(base-loww),可变部分,不变部分,数组元素地址计算,设A为2维数组,按行存放,每个元素宽度为w,lowi为第i维的下界,ni为第i维可取值的个数;base为A的第一个元素的相对地址;则A(i1,i2)这个元素的相对地址为:base+(i1-low1)n2+i2-low2)w上式可整理为:(i1n2+i2)w+base-(low1n2)+low2)w),可变部分,不变部分,数组元素地址计算,设A为n维数组,按行存放,每个元素宽度为w,lowi为第i维的下界,upi为第i维的上界ni为第i维可取值的个数(ni=upi-lowi+1)base为A的第一个元素相对地址元素Ai1,i2,ik相对地址公式(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)wC=base-(low1n2+low2)n3+low3)nk+lowk)w,可变部分,不变部分,id出现的地方也允许下面产生式中的L出现LidElist|idElistElist,E|E为了便于处理,文法改写为LElist|idElistElist,E|idE,(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,产生带数组元素引用的赋值语句基础文法,(1)SL:=E(2)EE+E(3)E(E)(4)EL(5)LElist(6)Lid(7)ElistElist,E(8)ElistidE,引入下列语义变量或语义过程(属性):Elist.ndim:下标个数计数器,即维数Elist.place:表示临时变量,用来临时存放已形成的Elist中的下标表达式计算出来的值.Elist.array:记录数组名limit(array,j):函数过程,它给出数组array的第j维的长度,(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,每个代表变量的非终结符L有两个属性:L.place:若L为简单变量i,指变量i的符号表入口若L为下标变量,指存放不变部分的临时变量的整数码L.offset:若L为简单变量,null,若L为下标变量,指存放可变部分的临时变量的整数码,(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,带数组元素引用的赋值语句翻译模式,(1)SL:=EifL.offset=nullthen/*L是简单变量*/emit(L.place:=E.place)elseemit(L.placeL.offset:=E.place)(2)EE1+E2E.place:=newtemp;emit(E.place:=E1.place+E2.place),(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,(3)E(E1)E.place:=E1.place(4)ELifL.offset=nullthenE.place:=L.placeelsebeginE.place:=newtemp;emit(E.place:=L.placeL.offset)end,带数组元素引用的赋值语句翻译模式,Ai1,i2,ik(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,(8)ElistidEElist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place,Ai1,i2,ik(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,(7)ElistElist1,Et:=newtemp;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,Ai1,i2,ik(i1n2+i2)n3+i3)nk+ik)w+base-(low1n2+low2)n3+low3)nk+lowk)w,(5)LElistL.place:=newtemp;emit(L.place:=Elist.arrayC);L.offset:=newtemp;emit(L.offset:=w*Elist.place)(6)LidL.place:=id.place;L.offset:=null,类型转换,用E.type表示非终结符E的类型属性对应产生式EE1opE2的语义动作中关于E.type的语义规则可定义为:ifE1.type=integerandE2.type=integerE.type:=integerelseE.type:=real算符区分为整型算符intop和实型算符realop,,x:=yi*j其中x、y为实型;i、j为整型。这个赋值句产生的三地址代码为:T1:=iint*jT3:=inttorealT1T2:=yreal+T3x:=T2,关于产生式EE1E2的语义动作,E.place:=newtemp;ifE1.type=integerandE2.type=integerthenbeginemit(E.place:=E1.placeint+E2.place);E.type:=integerendelseifE1.type=realandE2.type=realthenbeginemit(E.place:=E1.placereal+E2.place);E.type:=realend,elseifE1.type=integerandE2.type=realthenbeginu:=newtemp;emit(u:=inttorealE1.place);emit(E.place:=ureal+E2.palce);E.type:=realendelseifE1.type=realandE2.type=integerthenbeginu:=newtemp;emit(u:=inttorealE2.place);emit(E.place:=E1.placereal+u);E.type:=realendelseE.type:=type_error,小结,赋值语句的翻译简单算术表达式及赋值语句数组元素的引用产生有关类型转换的指令,第七章语义分析和中间代码产生,中间语言赋值语句的翻译布尔表达式的翻译控制语句的翻译过程调用的处理,布尔表达式的翻译,布尔表达式的两个基本作用:用于逻辑演算,计算逻辑值;用于控制语句的条件式.产生布尔表达式的文法:EEorE|EandE|notE|(E)|irelopi|i,计算布尔表达式通常采用两种方法:1.如同计算算术表达式一样,一步步算1or(not0and0)or0=1or(1and0)or0=1or0or0=1or0=12.采用某种优化措施把AorB解释成ifAthentrueelseB把AandB解释成ifAthenBelsefalse把notA解释成ifAthenfalseelsetrue,两种不同的翻译方法:第一种翻译法:数值表示法AorBandC=D翻译成(1)(=,C,D,T1)(2)(and,B,T1,T2)(3)(or,A,T2,T3)第二种翻译法适合于作为条件表达式的布尔表达式使用.,1数值表示法,aorbandnotc翻译成T1:=notcT2:=bandT1T3:=aorT1关系表达式ab可等价地写成ifabthen1else0,翻译成三地址语句序列100:ifabgoto103101:T:=0102:goto104103:T:=1104:,产生布尔表达式的三地址代码的数值表示法翻译模式,过程emit将三地址代码送到输出文件中nextstat给出输出序列中下一条三地址语句的地址索引每产生一条三地址语句后,过程emit便把nextstat加1,产生布尔表达式的三地址代码的数值表示法翻译模式,EE1orE2E.place:=newtemp;emit(E.place:=E1.placeorE2.place)EE1andE2E.place:=newtemp;emit(E.place:=E1.placeandE2.place)EnotE1E.place:=newtemp;emit(E.place:=notE1.place)E(E1)E.place:=E1.place,产生布尔表达式的三地址代码的数值表示法翻译模式,Eid1relopid2E.place:=newtemp;emit(ifid1.placerelop.opid2.placegotonextstat+3);emit(E.place:=0);emit(gotonextstat+2);emit(E.place:=1)EidE.place:=id.place,ab翻译成100:ifabgoto103101:T:=0102:goto104103:T:=1104:,布尔表达式aborcdandef的翻译结果,100:ifabgoto103101:T1:=0102:goto104103:T1:=1104:ifcdgoto107105:T2:=0106:goto108107:T2:=1108:ifecorbcgotoL2“真”出口gotoL1L1:ifbcorbcgotoL2“真”出口gotoL1L1:ifbcorbcgotoL2“真”出口gotoL1L1:ifbdgotoL2“真”出口gotoL3“假”出口L2:(关于S1的三地址代码序列)gotoLnextL3:(关于S2的三地址代码序列),考虑如下表达式:aborcdandef,产生式语义规则Eid1relopid2E.code:=gen(ifid1.placerelop.opid2.placegotoE.true)|gen(gotoE.false)EE1orE2E1.true:=E.true;E1.false:=newlabel;E2.true:=E.true;E2.false:=E.false;E.code:=E1.code|gen(E1.false:)|E2.codeEE1andE2E1.true:=newlabel;E1.false:=E.false;E2.true:=E.true;E2.false:=E.fasle;E.code:=E1.code|gen(E1.true:)|E2.code,考虑如下表达式:aborcdandef假定整个表达式的真假出口已分别置为Ltrue和Lfalse,则按以上属性定义将生成如下的代码:,ifabgotoLtruegotoL1L1:ifcdgotoL2gotoLfalseL2:ifefgotoLtruegotoLfalse,控制语句中布尔表达式的翻译,两遍扫描为给定的输入串构造一棵语法树;对语法树进行深度优先遍历,进行语义规则中规定的翻译。一遍扫描在自底向上的语法分析过程中生成布尔表达式的三地址代码,考虑如下表达式:aborcdandef假定整个表达式的真假出口已分别置为Ltrue和Lfalse,两遍扫描实现布尔表达式的翻译,EEorE|EandE|notE|(E)|irelopi|i,产生式语义规则Eid1relopid2E.code:=gen(ifid1.placerelop.opid2.placegotoE.true)|gen(gotoE.false)EE1orE2E1.true:=E.true;E1.false:=newlabel;E2.true:=E.true;E2.false:=E.false;E.code:=E1.code|gen(E1.false:)|E2.codeEE1andE2E1.true:=newlabel;E1.false:=E.false;E2.true:=E.true;E2.false:=E.fasle;E.code:=E1.code|gen(E1.true:)|E2.code,ifabgotoLtruegotoL1ifcdgotoL2gotoLfalseifefgotoLtruegotoLfalse,(Ltrue,Lfalse),(Ltrue,L1),(Ltrue,Lfalse),(L2,Lfalse),(Ltrue,Lfalse),L1:,L2:,一遍扫描实现布尔表达式的翻译,采用四元式形式把四元式存入一个数组中,数组下标就代表四元式的标号约定四元式(jnz,a,-,p)表示ifagotop四元式(jrop,x,y,p)表示ifxropygotop四元式(j,-,-,p)表示gotop,一遍扫描实现布尔表达式的翻译,aborcd,100:(j,a,b,?)101:(j,-,-,102)102:(j,c,d,?)103:(j,-,-,?)104:110:,主要问题:产生跳转指令四元式时,它的转移地址无法立即知道需要以后扫描到特定位置时才能回过头来确定把这个未完成的四元式地址作为E的语义值保存,待机回填。,为非终结符E赋予两个综合属性E.truelist和E.falselist。它们分别记录布尔表达式E所应的四元式中需回填“真”、“假”出口的四元式的标号所构成的链表例如:假定E的四元式中需要回填真出口的p,q,r三个四元式,则E.truelist为下列链:(p)(x,x,x,0)(q)(x,x,x,p)(r)(x,x,x,q),链尾:0为链末标志,E.truelist=r,r为链首,为了处理E.truelist和E.falselist,引入下列语义变量和过程:变量nextquad,它指向下一条将要产生但尚未形成的四元式的地址(标号)。nextquad的初值为1,每当执行一次emit之后,nextquad将自动增1。函数makelist(i),它将创建一个仅含i的新链表,其中i是四元式数组的一个下标(标号);函数返回指向这个链的指针。函数merge(p1,p2),把以p1和p2为链首的两条链合并为一,作为函数值,回送合并后的链首。过程backpatch(p,t),其功能是完成“回填”,把p所链接的每个四元式的第四区段都填为t。,例如:过程backpatch(p,t),其功能是完成“回填”,把p所链接的每个四元式的第四区段都填为t。(r)(x,x,x,t)(q)(x,x,x,t)(p)(x,x,x,t),链尾,p,布尔表达式的文法,(1)EE1orME2(2)|E1andME2(3)|notE1(4)|(E1)(5)|id1relopid2(6)|id(7)M,布尔表达式的翻译模式,(7)MM.quad:=nextquad,(1)EE1orME2(2)|E1andME2,布尔表达式的翻译模式,(1)EE1orME2backpatch(E1.falselist,M.quad);E.truelist:=merge(E1.truelist,E2.truelist);E.falselist:=E2.falselist(2)EE1andME2backpatch(E1.truelist,M.quad);E.truelist:=E2.truelist;E.falselist:=merge(E1.falselist,E2.falselist),布尔表达式的翻译模式,(3)EnotE1E.truelist:=E1.falselist;E.falselist:=E1.truelist(4)E(E1)E.truelist:=E1.truelist;E.falselist:=E1.falselist,布尔表达式的翻译模式,(5)Eid1relopid2E.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(jrelop.op,id1.place,id2.place,0);emit(j,0)(6)EidE.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(jnz,id.place,0);emit(j,-,-,0),布尔表达式的翻译模式,作为整个布尔表达式的真假出口(转移目标)仍待回填.,(5)Eid1relopid2E.truelist:=makelist(nextquad)E.falselist:=makelist(nextquad+1);emit(jrelop.op,id1.place,id2.place,0);emit(j,0)(7)MM.quad:=nextquad,100:(j,a,b,0)101:(j,-,-,0)102:(j,c,d,0)103:(j,-,-,0)104:(j,e,f,0)105:(j,-,-,0),aborcdandef,or,and,(102,103),(1)EE1orME2backpatch(E1.falselist,M.quad);E.truelist:=merge(E1.truelist,E2.truelist);E.falselist:=E2.falselist(2)EE1andME2backpatch(E1.truelist,M.quad);E.truelist:=E2.truelist;E.falselist:=merge(E1.falselist,E2.falselist),100:(j,a,b,0)101:(j,-,-,0)102:(j,c,d,0)103:(j,-,-,0)104:(j,e,f,0)105:(j,-,-,0),104,(104,105,103),(104,100,105.103),102,103,100,aborcdandef,100(j,a,b,0)101(j,-,-,102)102(j,c,d,104)103(j,-,-,0)104(j,e,f,100)truelist105(j,-,-,103)falselist,小结,布尔表达式的翻译数值表示法作为条件控制的布尔表达式翻译一遍扫描的翻译模式,第七章语义分析和中间代码产生,中间语言赋值语句的翻译布尔表达式的翻译控制语句的翻译过程调用的处理,7.5控制语句的翻译,考虑下列产生式所定义的语句SifEthenS1|ifEthenS1elseS2|whileEdoS1其中E为布尔表达式。,利用属性文法定义语义设计一遍扫描的翻译模式,if-then语句SifEthenS1,E.code,S1.code,ToE.true,ToE.false,E.true:,E.false:,if-then语句的属性文法,产生式语义规则SifEthenS1E.true:=newlabel;E.flase:=S.next;S1.next:=S.nextS.code:=E.code|gen(E.true:)|S1.code,if-then-else语句SifEthenS1elseS2,E.code,S1.code,S2.code,ToE.true,ToE.false,gotoS.next,S.next,E.true:,E.false:,if-then-else语句的属性文法,产生式语义规则SifEthenS1elseS2E.true:=newlabel;E.false:=newlabel;S1.next:=S.nextS2.next:=S.next;S.code:=E.code|gen(E.true:)|S1.code|gen(gotoS.next)|gen(E.false:)|S2.code,while-do语句SwhileEdoS1,E.code,S1.code,ToE.true,ToE.false,gotoS.begin,S.begin:,E.true:,E.false:,while-do语句的属性文法,产生式语义规则SwhileEdoS1S.begin:=newlabel;E.true:=newlabel;E.false:=S.next;S1.next:=S.begin;S.code:=gen(S.begin:)|E.code|gen(E.true:)|S1.code|gen(gotoS.begin),考虑如下语句:whileabdoifcdthenx:=y+zelsex:=y-z,生成下列代码:L1:ifabgotoL2gotoLnextL2:ifcdgotoL3gotoL4L3:T1:=y+zx:=T1gotoL1L4:T2:=y-zx:=T2gotoL1Lnext:,一遍扫描翻译控制流语句,考虑下列产生式所定义的语句:(1)SifEthenS(2)|ifEthenSelseS(3)|whileEdoS(4)|beginLend(5)|A(6)LL;S(7)|SS表示语句,L表示语句表,A为赋值语句,E为一个布尔表达式,if语句的一遍扫描翻译相关产生式SifEthenS(1)|ifEthenS(1)elseS(2)改写后的产生式SifEthenMS1SifEthenM1S1NelseM2S2MN,引入属性S.nextlist,它与E.truelist和E.falselist类似,也是一个链表,链表中有需要回填目标标号的四元式(转移指令goto的四元式)的序号,翻译模式:1.SifEthenMS1backpatch(E.truelist,M.quad);S.nextlist:=merge(E.falselist,S1.nextlist)2.SifEthenM1S1NelseM2S2backpatch(E.truelist,M1.quad);backpatch(E.falselist,M2.quad);S.nextlist:=merge(S1.nextlist,N.nextlist,S2.nextlist)3.MM.quad:=nextquad4.NN.nextlist:=makelist(nextquad);emit(j,),while语句的翻译相关产生式SwhileEdoS(1)翻译为:,E的代码,S(1)的代码,“真”出口,“假”出口,为了便于回填,改写产生式为:SwhileM1EdoM2S1M,翻译模式:1.SwhileM1EdoM2S1backpatch(S1.nextlist,M1.quad);backpatch(E.truelist,M2.quad);S.nextlist:=E.falselistemit(j,M1.quad)2.MM.quad:=nextquad,产生式LL;S改写为:LL1;MSM,引入属性L.nextlist,它与S.nextlist类似,也是一个链表,链表中有需要回填目标标号的四元式(转移指令goto的四元式)的序号,翻译模式:1.LL1;MSbackpatch(L1.nextlist,M.quad);L.nextlist:=S.nextlist2.MM.quad:=nextquad,其它几个语句的翻译1.SbeginLendS.nextlist:=L.nextlist2.SAS.nextlist:=makelist()3.LSL.nextlist:=S.nextlist,翻译语句while(ab)doif(cd)thenx:=y+z;,布尔表达式的一遍翻译(5)Eid1relopid2E.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(jrelop.op,id1.place,id2.place,0);emit(j,0),赋值语句的一遍翻译Sid:=Ep:=lookup();ifpnilthenemit(p:=E.place)elseerrorEE1+E2E.place:=newtemp;emit(E.place:=E1.place+E2.place),控制语句的一遍翻译SifEthenMS1backpatch(E.truelist,M.quad);S.nextlist:=merge(E.falselist,S1.nextlist)MM.quad:=nextquadSAS.nextlist:=makelist(),控制语句的一遍翻译SwhileM1EdoM2S1backpatch(S1.nextlist,M1.quad);backpatch(E.truelist,M2.quad);S.nextlist:=E.falselistemit(j,M1.quad)MM.quad:=nextquad,翻译语句while(ab)doif(cd)thenx:=y+z;,100(j,a,b,102)101(j,-,-,107)102(j,c,d,104)103(j,-,-,100)104(+,y,z,T)105(:=,T,-,x)106(j,-,-,100)107,7.5.2标号与goto语句,标号定义形式L:S;标号引用gotoL;示例:,向后转移:L1:gotoL1;,向前转移:gotoL1;L1:,符号表信息,(p)(,)(n)(j,-,-,p),已,向后转移:L1:gotoL1;,符号表信息,(p)(j,-,-,0),未,向前转移:gotoL1;L1:,符号表信息,(p)(j,-,-,0)(q)(j,-,-,p),未,向前转移:gotoL1;gotoL1;L1:,符号表信息,(p)(j,-,-,0)(q)(j,-,-,p)(r)(j,-,-,q),未,向前转移:gotoL1;gotoL1;gotoL1;L1:,符号表信息,(p)(j,-,-,0)(q)(j,-,-,p)(r)(j,-,-,q)(k),未,向前转移:gotoL1;gotoL1;gotoL1;L1:,已,k,k,k,k,产生式SgotoL的语义动作:查找符号表;IFL在符号表中且定义否栏为已THENGEN(J,-,-,P)ELSEIFL不在符号表中THENBEGIN把L填入表中;置定义否为未,地址栏为nextquad;GEN(J,-,-,0)ENDELSEBEGIN/表示L在符号表中,但定义否栏为“未”Q:=L的地址栏中的编号;置地址栏编号为nextquad
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省徐州市新沂市2021-2022学年五年级上学期科学期中试卷(含答案)
- 民法典的新变化
- 江苏省连云港市赣榆区2026届化学高一第一学期期末联考模拟试题含解析
- 2026届湖北随州市普通高中化学高一上期中达标检测模拟试题含解析
- 2025年考研英语(一)长篇阅读技巧提升与押题卷
- 2025年注册电气工程师考试试卷 电气设计专项训练:电气工程设计与施工协调
- 2025年注册土木工程师考试真题试卷 建筑结构设计专项训练
- 2025年高考英语阅读理解专项训练:长篇阅读技巧揭秘
- 星光学校开展校园安全生产大排查大整治行动自查自纠报告
- 测量员岗位职责是什么
- 学校食堂清洗消毒工作流程培训测试题及答案
- 中学班主任培训
- 计算机组装及维护试题库附带答案总结全面
- 武汉公积金基本知识培训课件
- 2025公务员行政测试题及答案
- 校园垃圾清运应急预案演练(3篇)
- 2024年天河公安分局辅警考试试题(含答案)
- 信息安全知识培训课件
- 2025年山西省中考语文试卷真题(含答案)
- 心理健康教育:耐挫能力的培养
- 疼痛评估表课件
评论
0/150
提交评论