《编译程序的组织 (17).ppt》由会员分享,可在线阅读,更多相关《编译程序的组织 (17).ppt(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、6.6 6.6 程序流控制语句翻译程序流控制语句翻译在源程序中,在源程序中,控制语句控制语句控制语句控制语句用于实现程序流程的控制。用于实现程序流程的控制。程序设计理论已证明程序设计理论已证明,任何程序均可由任何程序均可由顺序结构顺序结构、条件条件分枝结构分枝结构和和循环循环三种结构等价地表示。因此三种结构等价地表示。因此,我们先讨我们先讨论这三类结构的翻译。这三类结构可用如下的文法描述:论这三类结构的翻译。这三类结构可用如下的文法描述:1.1.S S ifif E E thenthen S S(1)(1)2.2.|ifif E E thenthen S S(1)(1)elseelse S S
2、(2)(2)3.3.|whilewhile E E dodo S S(1)(1)4.4.|beginbegin L L endend (6.86.8)5.5.|A|A6.6.L LL L;S S7.7.|S|S1有关控制结构文法的注解注注解解1 1:上上述述文文法法中中,非非终终结结符符E、S、L、A分分别别代代 表表 为为 Expr、Statement、Series和和Assignment(即即:布尔表达式、语句、语句串和和赋值语句)。注注解解2 2:由由于于if语语句句可可能能带带来来二二义义性性,我我们们约约定定每每一一个个else总总是是与与其其前前离离它它最最近近的的尚尚未未得得到到
3、匹匹配配的的then相相匹匹配配。同同时时,为为了了区区别别同同一一产产生生式式中中不不同同位置上的位置上的同名文法符号同名文法符号同名文法符号同名文法符号,我们为其增加了,我们为其增加了上标上标。2控制语句的翻译文法控制语句的翻译文法现在,我们讨论文法现在,我们讨论文法6.8(已按前述文法拆分方法进行了改写已按前述文法拆分方法进行了改写)的翻译。)的翻译。1.Conditionif Expr then BackPatch($2.TC,NXQ);BackPatch($2.TC,NXQ);$.Chain=$2.FC$.Chain=$2.FC;当当使使用用此此产产生生式式进进行行归归约约时时,布布
4、尔尔表表达达式式Expr的的四四元元式式序序列列已已经经产产生生,并并且且then后后的的语语句句S的的第第一一四四元元式式序序号号已已能能确定确定(即即NXQNXQ的值的值).).因此因此,可用可用NXQ回填回填Expr的的T T链链;由由于于Expr的的F F链链的的去去向向未未定定,同同时时,因因在在执执行行归归约约动动作作时时Expr将将从从分分析析栈栈中中弹弹出出,所所以以其其F FC C属属性性需需保保留留下下来来,因因此此它它将将作作为为Condition的的一一个个综综合合属属性性ChainChain(整整型型,描描述述某某四四元元式式序序列列链链的的链链首首地地址址(序序号号
5、)传传递递上上去去,待待以以后能确定地址时回填。后能确定地址时回填。3控制语句的翻译文法控制语句的翻译文法(续续1 1)2.Statement Condition Statement$.Chain=Merge($1.Chain,$2.Chain);$.Chain=Merge($1.Chain,$2.Chain);此时,所翻译的是此时,所翻译的是if-then语句结构,原条件语句的布尔语句结构,原条件语句的布尔表达式表达式Expr的的F F链的去向应和链的去向应和then后的语句的出口一致,后的语句的出口一致,而归约所得的语句而归约所得的语句Statement的出口尚未确定(因为该的出口尚未确定
6、(因为该语句可能是更复杂语句结构中的子语句),因此应将这语句可能是更复杂语句结构中的子语句),因此应将这两条链合并成一个大链,待合适的时候回填。两条链合并成一个大链,待合适的时候回填。这里,这里,Statement的属性的属性ChainChain用于描述本语句结构的用于描述本语句结构的所有出口的链首。所有出口的链首。4控制语句的翻译文法控制语句的翻译文法(续续2 2)3.CondStElseCondition Statement else int int q=NXQ;q=NXQ;GEN(j,0,0,0);GEN(j,0,0,0);BackPatch($1.Chain,NXQ);BackPatc
7、h($1.Chain,NXQ);$.Chain=Merge($2.Chain,q);$.Chain=Merge($2.Chain,q);此此时时,编编译译系系统统已已明明确确当当前前正正在在处处理理的的是是if-then-else结结构构,then后后所所跟跟的的S(即即(6.8)式式中中的的S(1)已已经经处处理理完完毕毕,且且else后后所所跟跟的的S(即即(6.8)式式中中的的S(2)第第一四元式的位置已经可以确定。一四元式的位置已经可以确定。在在翻翻译译S(2)之之前前,应应紧紧接接S(1)的的四四元元式式序序列列后后产产生生一一个个无无条条件件转转四四元元式式,并并将将此此四四元元式
8、式与与S(1)的的出出口口链链合合而而为为一一,作作为为整整个个S的的出出口口,这这一一信信息息将将作作为为CondStElse的的综综合合属属性性ChainChain传传递递上上去去;另另外外,Expr的的假假出出口口(即即Condition的综合属性的综合属性)此时可回填。此时可回填。5控制语句的翻译文法控制语句的翻译文法(续续3 3)4.StatementCondStElseStatement$.Chain=Merge($1.Chain,$2.Chain)$.Chain=Merge($1.Chain,$2.Chain);此此时时,整整个个条条件件语语句句已已经经翻翻译译完完毕毕,应应将将
9、S(1)与与S(2)的的出出口口合合而而为为一一,作作为为整整个个S的的出出口口链链待待以以后后回回填填(注注意意,S的的出出口口未未必必是是下下一一四四元元式式,因因为为,S本本身身也也可可能能作作为为一一个个语语法法成分出成分出现现在更复在更复杂杂的的语语句句结结构中)。构中)。5.Wlwhile$.LoopStartPlace=NXQ;$.LoopStartPlace=NXQ;由由于于while循循环环要要求求每每次次执执行行完完循循环环体体之之后后,应应无无条条件件转转向向循循环环判判断断条条件件Expr处处,因因此此,需需将将Expr的的第第一一四四元元式式序序号号记记下来,以便在翻
10、下来,以便在翻译译完完S后后产产生一个生一个转转向此向此处处的四元式。的四元式。6控制语句的翻译文法控制语句的翻译文法(续续4 4)6.WEDWl Expr do BackPatch($2.TC,NXQ);BackPatch($2.TC,NXQ);$.Chain=$2.FC;$.Chain=$2.FC;$.LoopStartPlace=$1.LoopStartPlace;$.LoopStartPlace=$1.LoopStartPlace;此时,控制循环的布尔表达式此时,控制循环的布尔表达式Expr已经翻译完毕,循环体已经翻译完毕,循环体S的第一四元式序号已知(即的第一四元式序号已知(即NXQ
11、NXQ的当前值的当前值),),可用其回填可用其回填Expr的的T T链;链;Expr的的F F链将是整个循环语句的出口,目前还不明去向,链将是整个循环语句的出口,目前还不明去向,但由于但由于Expr将被归约,其将被归约,其FCFC属性应作为属性应作为WED的一个属的一个属性传递之;性传递之;另外,另外,Wl的属性的属性LoopStartPlaceLoopStartPlace(它描述循环起始点信息它描述循环起始点信息)也应作为也应作为WED的的LoopStartPlaceLoopStartPlace属性向上传递。属性向上传递。7控制语句的翻译文法控制语句的翻译文法(续续5 5)7.Stateme
12、ntWED Statement BackPatch($2.TC,$1.LoopStartPlace);BackPatch($2.TC,$1.LoopStartPlace);GEN(j,0,0,$1.LoopStartPlace);$.Chain=$1.ChainGEN(j,0,0,$1.LoopStartPlace);$.Chain=$1.Chain;此时,整个此时,整个while循环语句已经翻译完毕,但还需要做收尾循环语句已经翻译完毕,但还需要做收尾工作:工作:(1)将将S(1)携带的出口链用本结构的第一四元式序号(即携带的出口链用本结构的第一四元式序号(即WED的的LoopStartPla
13、ceLoopStartPlace属性)回填属性)回填;(2)产生一个以此序号为转向目标的无条件转四元式产生一个以此序号为转向目标的无条件转四元式;(3)由于本结构的最终出口未定,因此,它将作为由于本结构的最终出口未定,因此,它将作为Statement的的ChainChain属性保留下来,待回填。属性保留下来,待回填。8控制语句的翻译文法控制语句的翻译文法(续续6 6)8.Statement Assignment$.Chain=0;$.Chain=0;由于赋值语句不含其它非常规出口(无出口链),所以,由于赋值语句不含其它非常规出口(无出口链),所以,Statement的出口链为空。的出口链为空。
14、9.SeriesStatement$.Chain=$1.Chain;$.Chain=$1.Chain;由于由于Statement的出口链属性在此时仍不能确定出口在何的出口链属性在此时仍不能确定出口在何处,所以,应作为处,所以,应作为Series的属性传递之。的属性传递之。10.SeiesSemicolonSeries;BackPatch($1.Chain,NXQ);BackPatch($1.Chain,NXQ);此时,分析器刚扫视完分号,控制流程将顺序执行,所以应此时,分析器刚扫视完分号,控制流程将顺序执行,所以应以下一个四元式的序号回填以下一个四元式的序号回填Series的出口链。的出口链。9控制语句的翻译文法控制语句的翻译文法(续续7 7)11.SeriesSeriesSemicolon Statement$.Chain=$2.Chain;$.Chain=$2.Chain;语义动作的含义与语义动作的含义与产生式产生式产生式产生式9 9 9 9类似。类似。12.Statement begin Series end$.Chain=$2.Chain$.Chain=$2.Chain;显然,复合语句的出口(即显然,复合语句的出口(即Series的属性)尚未确定去向,的属性)尚未确定去向,故将其作为故将其作为Statement的属性保留(传递)之。的属性保留(传递)之。10