《編譯原理》控制流語句 if 和 while 語句的翻譯 - 例題解析
將 if 和 while 語句翻譯成四元式
注:不同教材會有小差異,使用 _ 或者 — ,如果是 —,請注意區分 — 和 - 減號
(一)四元式
四元式是普遍采用的一種中間代碼形式,由於它便於優化處理,所以目前在很多編譯程序中得到廣泛應用。
形式 | 表示 |
---|---|
一般形式 | (op ,arg1 ,arg2 ,result) |
一目運算 | (op ,arg1 ,____ ,result) |
0元運算 | (op ,____ ,____,result) |
如:a:= -b+c*d的四元式為:
(:= 表示賦值,用於區分 =)
(1) ( - , b , __ , T1 )
(2) ( * , c , d , T2 )
(3) ( + , T1 , T2 , T3 )
(4) ( := , T3 , __ , a )
T1 := -b
T2 := c * d
T3 := T1 + T2
a : = T3
四元式的最大優點:
在實現代碼優化時,通常需要從現有的運算序列刪去某些運算,或者需要挪動一些運算的位置,這對於四元式序列來說,是比較容易實現的。
因為四元式之間的聯系是通過臨時變量來實現的,所以更改其中一些四元式給整個序列帶來的影響較小
(二)if 語句的翻譯
描述 if 語句的文法如下:
if E then S1
或者
if E then S1 else S2
其中 E 為布爾表達式
S1,S2 本身也可以是 if 語句或者其他語句
控制語句中的回填技術
一些轉移地址並不能不產生這些四元式的同時得知。
也就是說,一個布爾式的真假出口往往不能在產生四元式的同時就確定。
因此,要回填這些地址
拉鏈
為了記錄需回填地址的四元式,采用 “拉鏈” 的方法。
把需回填 E.true 的四元式拉成一鏈,把需回填 E.false 的四元式拉成一鏈,分別稱做“真”鏈和“假”鏈
IF 語句翻譯過程
IF 語句翻譯過程大致如下:
(1) 翻譯 E,獲得一組四元式;
(2) 掃描 E 的真出口,回填;
假出口尚不知;
(3) 翻譯 S(1) ;
(4) 遇到 else,S(1) 結束,生成一條無條件轉移四元式,但出口不明;
(5) 翻譯 S(2) ,結束。
if 語句的翻譯例題:
對下語句進行翻譯:
if A > B or C then
if D<E then F:=F+1
else F:=F-1
else F:=0;
四元式從 100 開始編號:
100 ( j> , A , B , 104 )
101 ( j , _ , _ , 102 )
102 ( jnz, C , _ , 104 )
103 ( j , _ , _ , 112 )
104 ( j< , D , E , 106 )
105 ( j , _ , _ , 109 )
106 ( + , F , 1 , T1 )
107 ( := , T1 , _ , F )
108 ( j , _ , _ , 113 )
109 ( - , F , 1 , T2 )
110 ( := , T2 , _ , F)
111 ( j , _ , _ , 113 )
112 ( := , 0 , _ , F )
113 ...
解釋:
(1)第 100 號 ( j> , A , B , 104 ) ,表式示如果滿足 A > B,此時四元式第四個表示結果的是 104,就表示跳轉到 104 號執行,是一個真出口;如果不滿足就會繼續走到下個序號的四元式 101 號。
(2)第 101 號 ( j , _ , _ , 102 ),表示直接到 102。雖然沒有這一句也能到達 102,但是它表表示上面不滿足的狀態,也叫假出口,必須要寫。
(3)所以寫條件要一寫一對,因為不滿足就走到下一個序號的四元式,並且假出口只能在它相鄰的下面。
(4)第 102 號 ( jnz, C , _ , 104 ),只有一個參數,操作符時 jnz,然后同樣是滿足則到 104,不滿足走到下一個序號的四元式。
(5)第 106 號 ( + , F , 1 , T1 ),T1 是 F + 1 的結果,此時不表示跳轉,不跳轉也就是走到下個序號的四元式。
(6)注意賦值語句的表示,第 107 號 ( := , T1 , _ , F ),是將被賦值的元素放在結果的位置上,就是四元式第四個位置。
(三)while 語句的翻譯
while 語句的翻譯過程
while 語句的翻譯過程大致如下:
(1) 翻譯 E,待填 E 的真鏈、假鏈;
(2) 掃描 do 后,回填 E 的真鏈;
(3) 翻譯 S 語句稱代碼段;
(4) 無條件轉移到 E 代碼段的第一條四元式,若 S 有語句鏈,也應轉到 E 代碼段的第一條四元式。
while 語句的翻譯例題
對下語句進行翻譯:
While (a<b) do
{ a=a+3;
b=b-3;
}
四元式從 100 開始編號:
101 (j<, a, b, 103) 真出口
102 (j, _ , _ , 108) 假出口
103 (+, a, 3, T1)
104 (:=, T1, _ , a)
105 (-, b, 3, T2)
106 (:=, T2, _ , b)
107 (j, _ , _ , 101)
108 ...
解釋:
(1)原理同上
(2)注意賦值語句的表示,例如第 104 號 (:=, T1, _, a),是將被賦值的元素放在結果的位置上,就是四元式第四個位置。