首页 理论教育 编译原理与实践:典型控制语句翻译

编译原理与实践:典型控制语句翻译

时间:2023-11-17 理论教育 版权反馈
【摘要】:就控制语句而言,作为条件的布尔表达式的作用主要在于控制流程的转向,图6-20给出了上述三种典型控制语句的中间代码结构,下面分别予以介绍。表6-16控制语句的自下而上翻译模式就条件语句S→if E then M1S1 N else M2S2来说,语义动作backpatch将S1的第一条语句的编号回填给E的真链表,以便控制流程在E为真时转向语句S1来执行。因此,表6-16中的翻译模式要与之前介绍过的赋值语句和布尔表达式的翻译模式结合起来使用。

编译原理与实践:典型控制语句翻译

本节主要介绍if-then、if-then-else以及while-do这三种典型控制语句的翻译方法,至于其他控制语句,如repeat-until语句和for-to-do语句等,可类似得到,这里不再赘述。

就控制语句而言,作为条件的布尔表达式的作用主要在于控制流程的转向,图6-20给出了上述三种典型控制语句的中间代码结构,下面分别予以介绍。

图6-20 典型控制语句的中间代码结构

(1)if E then S1语句

该语句的中间代码结构如图6-20(a)所示。从图中可以看出,条件表达式E的真出口E.true应为S1的第一个四元式的编号,只有当读取到then时,才能知道S1的入口位置,此时可以回填。需要注意的是,S1本身也可以是if语句或其他语句,对于下面将要讲到的S2也是一样。

(2)if E then S1 else S2语句

该语句的中间代码结构如图6-20(b)所示。与图6-20(a)相比,增加了对else的处理部分,此时E的假出口E.false应为S2的第一个四元式的编号,只有当读取到else时,才能知道S2的入口位置,此时可以回填。另外,S1执行完毕后应跳转到S2的后面去执行,因此,在S1和S2之间将生成一条无条件转移语句。

(3)while E do S1语句

该语句的中间代码结构如图6-20(c)所示。作为循环语句控制条件的布尔表达式E的作用是,若E为真,则执行S1语句,否则将跳过S1,执行while语句后面的语句。因此,E的真出口E.true应为S1的第一个四元式的编号,只有当读取到do时,才能知道S1的入口位置,此时可以回填。另外,S1执行完成后,应该转移到E的开始位置重新判断E的值,因此,在S1之后将生成一条无条件转移语句以完成此任务。由于S1本身也可能是一个控制语句,控制流程有可能会从S1的中间某点直接转移到E的开始位置来重新判断E的值,因此,需要增加S1.next来表示一条待填的转移链。

综上考虑,现给出如表6-16所示的一遍扫描翻译模式,以便在自下而上的分析过程中生成控制语句的四元式代码。

表6-16 控制语句的自下而上翻译模式

就条件语句S→if E then M1S1 N else M2S2来说,语义动作backpatch(E.true,M1.quad)将S1的第一条语句的编号回填给E的真链表,以便控制流程在E为真时转向语句S1来执行。同样,语义动作backpatch(E.false,M2.quad)将S2的第一条语句的编号回填给E的假链表,以便控制流程在E为假时转向语句S2来执行。另外,引入标记非终结符N的目的在于生成一条无条件转移指令,当执行完S1后跳过S2的执行。

就循环语句S→while M1 E do M2S1而言,属性S.begin用来标记整个while语句S的第一条指令。语义动作backpatch(S1.next,M1.quad)将S.begin的值(用M1.quad来记录)回填到S1.next所表示的待填转移链中,以实现重复执行S1的目的。当然,在S1之后增加一条无条件转向E的指令是必不可少的。另外,语义动作backpatch(E.true,M2.quad)将S1的第一条语句的编号回填给E的真链表,以便控制流程在E为真时转向语句S1来执行。只有当E为假时才会结束while语句S的执行,这由语义动作S.next:=E.false来完成。(www.xing528.com)

再考虑语句表L→L1;MS,就执行顺序来说,语句L1之后应该执行语句S,因此,S的第一条语句的编号被回填给L1的待填转移链中,这将由语义动作backpatch(L1.next,M.quad)来实现。

综上所述,所谓控制流程,实际上就是在适当的时候进行回填,从而使得赋值语句(用A表示)和布尔表达式(用E表示)的求值顺序得到合适的连接。因此,表6-16中的翻译模式要与之前介绍过的赋值语句和布尔表达式的翻译模式结合起来使用。

例6.8 综合考虑控制语句、赋值语句以及布尔表达式的翻译模式,可将语句

while(a<b)do

if(c<d)then x:=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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈