编译原理--03 语法制导翻译和中间代码生成复习(清华大学出版社第3版) (3)

布尔表达式翻译成四元式序列,如\(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\)的所有四元式构造一条假链的链表

对于上面的例子,真链和假链如下图:

编译原理--03 语法制导翻译和中间代码生成复习(清华大学出版社第3版)

其中(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] \]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggjzx.html