编译原理——将代码翻译成四元式序列
·
四元式的定义
四元式的一般形式为(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。
更多推荐
已为社区贡献2条内容
所有评论(0)