布尔表达式翻译成四元式序列,如\(a\; or\; b\; and\; not\; c\)的翻译结果为:
\((1)\quad t_1 :=\;not\;c\)
\((2)\quad t_2 :=b\;and\;t_1\)
\((3)\quad t_3 :=a\;or\;t_2\)
现在有文法:
\(S\rightarrow if\;E\;then\;S1\mid if\;E\;then\;S1\;else\;S2\mid while\;E\;do\;S1\)
翻译这部分的题目主要是以给定四元式序列,然后填空。
对布尔表达式\(E = a\; rop\; b\),可以翻译成:
\((1)\quad if\;a\;rop\;b\;goto\; E.true\)
\((2)\quad goto\;E.false\)
但此时\(E.true\)和\(E.false\)的值仍不能被确定。例如:
\(S\rightarrow if\;E\;then\;S1\;else\;S2\)
\(E.true\)的值为\(S1\)的第一条四元式的地址
\(E.false\)的值为\(S2\)的第一条四元式的地址
\(if\;a<b\;or\;c<d\;and\;e>f\;then\;S1\;else\;S2\)的四元式序列:
\((1)\quad if\;a<b\;goto\; \underline{E.true}\)
\((2)\quad goto\; \underline{(3)}\)
\((3)\quad if\;c<d\;goto\; \underline{(5)}\)
\((4)\quad goto\; \underline{E.false}\)
\((5)\quad if\;e>f\;goto\; \underline{E.true}\)
\((6)\quad goto\;\underline{E.false}\)
\((7)\quad S1\;begin...\)
\(...\)
\((p-1)\quad ...S1\;end\)
\((p)\quad goto \;\underline{q}\)
\((p+1)\quad S2\;begin...\)
\(...\)
\((q-1)\quad ...S2\;end\)
\((q)\quad ...\)
在产生出S1和S2的状态块后,才能进行地址回填。上面的\(E.true\)应填\((7)\),而\(E.false\)应填\((p+1)\)。
为了解决地址回填的问题,需要采用拉链法,把需要回填\(E.true\)的所有四元式构造并维护一条真链的链表,把需要回填\(E.false\)的所有四元式构造一条假链的链表
对于上面的例子,真链和假链如下图:
其中(5)为真链的链首,(6)为假链的链首。一旦确定S1和S2的地址,就可以沿着链作地址回填
但还有3种情况会使得四元式序列变得十分复杂,这里不讨论:
连续的\(or\)或连续的\(and\)
连续的\(if-else\;if-else\;if...\)
嵌套条件语句
循环语句中布尔表达式翻译现需要翻译语句:\(while\;a<b\;do\;if\;c<d\;then\;X:=Y+Z\)
\(100:\quad if\;a<b\;goto\; \underline{E.true}\)
\(101:\quad goto\; \underline{E.false}\)
\(102:\quad if\;c<d\;goto\; \underline{104}\)
\(103:\quad goto\; \underline{106}\)
\(104:\quad t1:=Y+Z\)
\(105:\quad X:=t1\)
\(106:\quad goto\;\underline{100}\)
\(107: \quad...\)
分析到状态块的开始就可以确认\(E.true=102\),而分析完状态块的结束之后就可以确认\(E.false=107\)
for循环语句翻译现需要翻译语句:\(for\;I\;:=\;1\;step\;1\;until\;Y\;do\;X:=X+1\)
等价于C语言的:\(for(I=1;I<=Y;++I) X=X+1;\)
\(100:\quad I:=1\)
\(101:\quad goto\;\underline{103}\)
\(102:\quad I:=I+1\)
\(103:\quad if\;I<=Y\;goto\; \underline{105}\)
\(104:\quad goto\; \underline{108}\)
\(105:\quad T:=X+1\)
\(106:\quad X:=T\)
\(107:\quad goto\; \underline{102}\)
\(108: \quad...\)
对于一个静态的n维数组,要访问其中一个元素,可以使用下标法:
\[A[i_1,i_2,...,i_n] \]