四元式的定义
四元式的一般形式为(op, arg1, arg2, result),其中:
op为一个二元(也可以是零元或一元)运算符arg1和arg2为两个运算对象,可以是变量、常数或者系统定义的临时变量名result为运算结果。
在中间代码生成阶段中,我们需要对源代码生成一个四元式序列。
其中,op可以为数学运算符(+,-,*,/,%,=等),例如:
a = b + c的四元式为(+, b, c, a)
也可以是布尔运算符(j,jnz,jez,jrop),例如:
(j, _, _, p)表示无条件跳转第p个四元式
(jnz, A, _, p)表示若A为真则跳转到第p个四元式
(jez, A, _, p)表示若A为假则跳转到第p个四元式
(jrop, A, B, p)表示若A rop B为真则跳转到第p个四元式
实例
实例1:将下列的IF语句翻译成四元式序列
if A and B and (C > D)
then
if A < B then F := 1
else F := 0
else G := G + 1
首先将上述语句转换为流程图:

红色的数字表示该逻辑对应的地址,最终得出每个地址的四元式序列为:
(jnz, A, _, 3),含义为当A为真时跳转到地址3。(j, _, _, 13),其含义为A为假时跳转到地址13。(jnz, B, _, 5),含义为当B为真时跳转到地址5。(j, _, _, 13),其含义为B为假时跳转到地址13。(j>, C, D, 7),含义为当C>D为真时跳转到地址7。(j, _, _, 13),其含义为B为假时跳转到地址13。(j<, A, B, 9)(j, _, _, 11)(:=, 1, _, F),F:=1的四元式(j, _, _, 15)(:=, 0, _, F),F:=0的四元式(j, _, _, 15)(+, G, 1, G)、(:=, T, _, G),其含义为G:=G+1的四元式,因为该语句分为了两步:第一步计算G + 1,第二步将第一步计算的结果赋给G,所以有两个四元式。
实例2:将下列的FOR语句翻译成四元式序列
for i := a + b * 2 to c + d + 10 do
if h > g then p := p + 1
将上述语句转换为流程图:

四元式序列:
(*, b, 2, t1),先将2 * b的结果赋给t1;(+, a, t1, t2),将t1 + a的结果赋给t2;(+, c, d, t3),将c + d的结果赋给t3;(+, t3, 10, t4),将t3 + 10的结果赋给t4;(:=, t2, _, i),将t2赋给i;(:=, t4, _, t),将t4赋给t;(j, _, _, 10),跳转到10;(+, i, 1, t5),将i + 1结果赋给t5;(:=, t5, _, i),将t5的值赋给i;(j<=, i, t, 11),i <= t为真时跳转到11;(j>, h, g, 13),h > g时跳转到13;(j, _, _, 8),直接跳转到8;(+, p, 1, t6),将p + 1的值赋给t6;(:=, t6, _, p),将t6的值赋给p;(j, _, _, 8),直接跳转到8。
本文详细介绍了四元式的概念及其在中间代码生成过程中的应用。通过具体实例,展示了如何将高级语言的控制结构(如IF和FOR语句)转化为四元式序列,为编译原理的学习提供了深入理解。

1万+

被折叠的 条评论
为什么被折叠?



