5.6程序流控制语句的翻泽 在源程序中,控制语句用于实现程序流程 的控制。一般而言,程序流程控制可大致 分为顺序结构(如复合语句)、分枝结构 (如if条件语句和实现多分枝的case语句 等)、循环结构(如for循环、while循环、 repeat循环等等)三类。另外,GOTO语句 也是一类常见改变流程的控制语句。下面, 我们将对常见的一些控制结构的翻译进行 讨论
5.6 程序流控制语句的翻译 • 在源程序中,控制语句用于实现程序流程 的控制。一般而言,程序流程控制可大致 分为顺序结构(如复合语句)、分枝结构 (如if条件语句和实现多分枝的case语句 等)、循环结构(如for循环、while循环、 repeat循环等等)三类。另外,GOTO语句 也是一类常见改变流程的控制语句。下面, 我们将对常见的一些控制结构的翻译进行 讨论
5.6.1常见控制猪构的禄 程序设计理论已证明,任何程序均可由序列结 构、条件分枝结构和while循环三种结构等价 地表示。因此,我们先讨论这三类结构的翻译。 这三类结构可用如下的文法描述: 1.S→if E then S(1) if E then S(1)else S(2) 3. while E do S(1) 4. I begin L end (5.8) 5. IA 67 L→L;S IS
5.6.1 常见控制结构的翻译 • 程序设计理论已证明,任何程序均可由序列结 构、条件分枝结构和while循环三种结构等价 地表示。因此,我们先讨论这三类结构的翻译。 这三类结构可用如下的文法描述: 1. S→ if E then S(1) 2. | if E then S(1) else S(2) 3. | while E do S(1) 4. | begin L end (5.8) 5. | A 6. L→L ;S 7. | S
有关控制结构文法的注解 上述文法中,非终结符S、L、A分别代表语 句、语句串和赋值语句,E代表布尔表达式 此外,由于f语句可能带来二义性,我们约 定每一个else总是与其前离它最近的尚未得 到匹配的then相匹配。在文法(5.8)中,为 了区别同一产生式中不同位置上的同名文 法符号,我们为其增加了上标
有关控制结构文法的注解 • 上述文法中,非终结符S、L、A分别代表语 句、语句串和赋值语句,E代表布尔表达式。 此外,由于if语句可能带来二义性,我们约 定每一个else总是与其前离它最近的尚未得 到匹配的then相匹配。在文法(5.8)中,为 了区别同一产生式中不同位置上的同名文 法符号,我们为其增加了上标
条件语句的处理方法 ·在5.5节的图5-5中,我们已经给出了if语句和while 语句的代码结构。 ·布尔表达式E具有两个属性:E.TC与E.FC,用来 分别指示E的真链和假链的链首。 ·当E出现在条件语句if-then-else中时,根据条件语 句的语义,当语法分析器扫视到then时,E的真 出口已经确定,此时即可用NXQ对E的真链进行 回填;而当扫视到else时,即可用NXQ对E的假 链进行回填
条件语句的处理方法 • 在5.5节的图5-5中,我们已经给出了if语句和while 语句的代码结构。 • 布尔表达式E具有两个属性:E.TC与E.FC,用来 分别指示E的真链和假链的链首。 • 当E出现在条件语句if-then-else中时,根据条件语 句的语义,当语法分析器扫视到then时, E的真 出口已经确定,此时即可用NXQ对E的真链进行 回填;而当扫视到else时,即可用NXQ对E的假 链进行回填
条件语句的翻译结构 注意, 动作2中 的内容与教材中 因此,if-then-else结构的翻译文法可写为: 的内容略有不同, 但功能相同。 S→if E then BackPatch(E.TC,NXQ);/*动作1:回填Ey链*/} S(1)else {intT=GEN(j,0,0,0);/*S(1)的常规出口,由此转出所在 的条件语句;注意:此时NXQ在GEN函数内被加1*/ T=Merge(T,S(1).Chain); BackPatch(E.FC,NXQ)i/*动作2:将S的常规出口与 S程序结构内的其它出口(已在的翻译过程中拉成链, 由S).Chain,属性指示)合并成一个链;并以S2的第一 条四元式的序号回填E的假链*/ S(2){S.Chain=Merge(T,S(2).Chain); /*动作3:将的S2)出口与S2)的出口合并,作为S的出口*/
条件语句的翻译结构 因此,if-then-else结构的翻译文法可写为: S→if E then {BackPatch(E.TC,NXQ);/*动作1:回填E的真链*/} S(1) else {int T= GEN(j,0,0,0); /*S(1)的常规出口,由此转出所在 的条件语句;注意:此时NXQ在GEN函数内被加1 */ T=Merge(T, S(1) .Chain); BackPatch(E.FC,NXQ); /*动作2:将S (1)的常规出口与 S (1)程序结构内的其它出口(已在的翻译过程中拉成链, 由S (1).Chain属性指示)合并成一个链;并以S (2)的第一 条四元式的序号回填E的假链*/ } S(2) {S.Chain=Merge(T, S(2) .Chain); /*动作3:将的S (2)出口与S (2)的出口合并,作为S的出口*/ } 注意,动作2中 的内容与教材中 的内容略有不同, 但功能相同