編譯原理——將代碼翻譯成四元式序列

四元式的定義

四元式的一般形式爲(op, arg1, arg2, result),其中:

  • op爲一個二元(也可以是零元或一元)運算符
  • arg1arg2爲兩個運算對象,可以是變量、常數或者系統定義的臨時變量名
  • result爲運算結果。

在中間代碼生成階段中,我們需要對源代碼生成一個四元式序列。

其中,op可以爲數學運算符(+-*/%=等),例如:
a = b + c的四元式爲(+, b, c, a)

也可以是布爾運算符(jjnzjezjrop),例如:
(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

首先將上述語句轉換爲流程圖:
在這裏插入圖片描述

紅色的數字表示該邏輯對應的地址,最終得出每個地址的四元式序列爲:

  1. (jnz, A, _, 3),含義爲當A爲真時跳轉到地址3。
  2. (j, _, _, 13),其含義爲A爲假時跳轉到地址13。
  3. (jnz, B, _, 5),含義爲當B爲真時跳轉到地址5。
  4. (j, _, _, 13),其含義爲B爲假時跳轉到地址13。
  5. (j>, C, D, 7),含義爲當C>D爲真時跳轉到地址7。
  6. (j, _, _, 13),其含義爲B爲假時跳轉到地址13。
  7. (j<, A, B, 9)
  8. (j, _, _, 11)
  9. (:=, 1, _, F)F:=1的四元式
  10. (j, _, _, 15)
  11. (:=, 0, _, F)F:=0的四元式
  12. (j, _, _, 15)
  13. (+, 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

將上述語句轉換爲流程圖:
在這裏插入圖片描述
四元式序列:

  1. (*, b, 2, t1),先將2 * b的結果賦給t1
  2. (+, a, t1, t2),將t1 + a的結果賦給t2
  3. (+, c, d, t3),將c + d的結果賦給t3
  4. (+, t3, 10, t4),將t3 + 10的結果賦給t4
  5. (:=, t2, _, i),將t2賦給i
  6. (:=, t4, _, t),將t4賦給t
  7. (j, _, _, 10),跳轉到10;
  8. (+, i, 1, t5),將i + 1結果賦給t5
  9. (:=, t5, _, i),將t5的值賦給i
  10. (j<=, i, t, 11)i <= t爲真時跳轉到11;
  11. (j>, h, g, 13)h > g時跳轉到13;
  12. (j, _, _, 8),直接跳轉到8;
  13. (+, p, 1, t6),將p + 1的值賦給t6
  14. (:=, t6, _, p),將t6的值賦給p
  15. (j, _, _, 8),直接跳轉到8。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章