控制语句的翻泽女法(续2) 3.CondStElse-Condition Statement else {int q=NXQ; GEN(j,0,0,0);BackPatch($1.Chain,NXQ); $$.Chain=Merge($2.Chain,q);} 此时,编译系统已明确当前正在处理的是if-then-else结 构,then后所跟的S(即(5.9)式中的S1)已经处理完 毕,且else后所跟的S(即(5.9)式中的S(2)第一四元 式的位置已经可以确定。 在翻译S(2)之前,应紧接S(1)的四元式序列后产生一个无条 件转四元式,并将此四元式与S1)的出口链合而为 作为整个S的出口,这一信息将作为CondStElse的综 合属性Chain传递上去;另外,Expr的假出口(即 Condition的综合属性)此时可回填
控制语句的翻译文法(续2) 3.CondStElse→Condition Statement else {int q=NXQ; GEN(j,0,0,0); BackPatch($1.Chain,NXQ); $$.Chain=Merge($2.Chain,q);} 此时,编译系统已明确当前正在处理的是if-then-else结 构,then后所跟的S(即(5.9)式中的S(1))已经处理完 毕,且else后所跟的S(即(5.9)式中的S(2))第一四元 式的位置已经可以确定。 在翻译S(2)之前,应紧接S(1)的四元式序列后产生一个无条 件转四元式,并将此四元式与S(1)的出口链合而为一, 作为整个S的出口,这一信息将作为CondStElse的综 合属性Chain传递上去;另外,Expr的假出口(即 Condition的综合属性)此时可回填
控制语句的翻泽女法(续3) 4.Statement->CondStElse Statement {$$.Chain=Merge($1.Chain,$2.Chain);} 此时,整个条件语句已经翻译完毕,应将S)与S2的出口合 而为一,作为整个S的出口链待以后回填(注意,S的出 口未必是下一四元式,因为,S本身也可能作为一个语法 成分出现在更复杂的语句结构中)。 5.Wl-while {$$.LoopStartPlace=NXQ;} 由于while循环要求每次执行完循环体之后,应无条件转向循 环判断条件Ep处,因此,需将Ep的第一四元式序号记 下来,以便在翻译完$后可产生一个转向此处的四元式
控制语句的翻译文法(续3) 4.Statement→CondStElse Statement {$$.Chain=Merge($1.Chain,$2.Chain);} 此时,整个条件语句已经翻译完毕,应将S(1)与S(2)的出口合 而为一,作为整个S的出口链待以后回填(注意,S的出 口未必是下一四元式,因为,S本身也可能作为一个语法 成分出现在更复杂的语句结构中)。 5. Wl→while {$$.LoopStartPlace=NXQ;} 由于while循环要求每次执行完循环体之后,应无条件转向循 环判断条件Expr处,因此,需将Expr的第一四元式序号记 下来,以便在翻译完S后可产生一个转向此处的四元式
控制语句的翻泽文法(续4) 6.WED-WI Expr do {BackPatch($2.TC,NXQ); $$.Chain=$2.FC;$$.LoopStartPlace=$1.LoopStartPlace; 此时,控制循环的布尔表达式Ep已经翻译完毕,循环体S 的第一四元式序号已知(即NXQ的当前值),可用其回填 EXpr的T链; Expr的F链将是整个循环语句的出口,目前还不明去向,但 由于Expr将被归约,其FC属性应作为WED的一个属性传 递之; 另外,WI的属性LoopStartPlace(它描述循环起始点信息)也 应作为WED的LoopStartPlace属性向上传递
控制语句的翻译文法(续4) 6. WED→Wl Expr do {BackPatch($2.TC,NXQ); $$.Chain=$2.FC; $$.LoopStartPlace=$1.LoopStartPlace;} 此时,控制循环的布尔表达式Expr已经翻译完毕,循环体S 的第一四元式序号已知(即NXQ的当前值),可用其回填 Expr的T链; Expr的F链将是整个循环语句的出口,目前还不明去向,但 由于Expr将被归约,其FC属性应作为WED的一个属性传 递之; 另外,Wl的属性LoopStartPlace(它描述循环起始点信息)也 应作为WED的LoopStartPlace属性向上传递
控制语句的翻泽女法(续5) 7.Statement-WED Statement [BackPatch($2.TC,$1.LoopStartPlace); GEN(j,0,0,$1.LoopStartPlace);$$.Chain=$1.Chain; 此时,整个while循环语句已经翻译完毕,但还需要做收尾 工作: (1)将S(1)携带的出口链用本结构的第一四元式序号(即 WED的LoopStartPlace属性)回填; (2)产生一个以此序号为转向目标的无条件转四元式, (3)由于本结构的最终出口未定,因此,它将作为 Statement的Chain属性保留下来,待回填
控制语句的翻译文法(续5) 7.Statement→WED Statement {BackPatch($2.TC,$1.LoopStartPlace); GEN(j,0,0,$1.LoopStartPlace); $$.Chain=$1.Chain;} 此时,整个while循环语句已经翻译完毕,但还需要做收尾 工作: (1)将S(1)携带的出口链用本结构的第一四元式序号(即 WED的LoopStartPlace属性)回填; (2)产生一个以此序号为转向目标的无条件转四元式; (3)由于本结构的最终出口未定,因此,它将作为 Statement的Chain属性保留下来,待回填
控制语句的翻泽文法(续6) 8.Statement -Assignment {$$Chain=0;) 由于赋值语句不含其它非常规出口(无出口链),所以, Statement的出口链为空。 9.Series-Statement {$$Chain=$1.Chain; 由于Statement的出口链属性在此时仍不能确定出口在何处, 所以,应作为Series的属性传递之。 10.SeiesSemicolon-Series ';'{BackPatch($1.Chain,NXQ); 此时,分析器刚扫视完分号,控制流程将顺序执行,所以应 以下一个四元式的序号回填Series的出口链
控制语句的翻译文法(续6) 8.Statement →Assignment {$$.Chain=0;} 由于赋值语句不含其它非常规出口(无出口链),所以, Statement的出口链为空。 9.Series→Statement {$$.Chain=$1.Chain;} 由于Statement的出口链属性在此时仍不能确定出口在何处, 所以,应作为Series的属性传递之。 10.SeiesSemicolon→Series ‘;’ {BackPatch($1.Chain,NXQ);} 此时,分析器刚扫视完分号,控制流程将顺序执行,所以应 以下一个四元式的序号回填Series的出口链