四元式的定義
四元式的一般形式爲(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。