A. 為什麼要採用中間代碼中間代碼有哪幾種形式(編譯原理)
採用中間代碼是把源程序映射成中間代碼表示,再映射成目標代碼的工作分在幾個階段進行,使編譯演算法更加清晰。中間代碼有四種形式:
1、逆波蘭表示
逆波蘭表示又稱後綴表示法,它是最簡單的一種中間代碼表示形式,早在編譯程序出現之前,它就用於表示算術表達式。
2、四元式
四元式也是一種比較普遍採用的中間代碼形式,
其形式為:(OP,ARG1,ARG2,RESULT)
3、三元式
三元式表示是與四元式類似的一種表示法,所不同的僅是三元式中沒有表示運算結果的部分,凡要涉及到運算結果的均用三元式的位置或序號來代替。
4、樹表示
樹形表示是三元式的翻版。在樹的表示中,樹葉均為運算對象,即常量或變數,其他結點表示運算符。表達式的樹形表示很容易實現:簡單變數或常量的樹就是該變數或常量自身。
(1)編譯原理三元式和四元式的書寫擴展閱讀
中間語言的優點:
1、中間語言與具體機器特性無關,一種中間語言可以為生成多種不同型號的目標機的目標代碼服務。
2、可對中間語言進行與機器無關的優化,有利於提高目標代碼的質量。
對於中間語言,要求其不但與機器無關,而且有利於代碼生成。
B. 編譯原理問題,求解答
好,我來幫你理解一下,先看基本知識:
四元式是一種比較普遍採用的中間代碼形式。四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG@及運算結果RESULT。運算對象和運算結果有時指用戶自己定義的變數,有時指編譯程序引進的臨時變數。例如a∶=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+, t1, t2, t3)
(4)(∶=,t3, -, a)
四元式和三元式的主要不同在於,四元式對中間結果的引用必須通過給定的名字,而三元式是通過產生中間結果的三元式編號。也就是說,四元式之間的聯系是通過臨時變數實現的。
有時,為了更直觀,也把四元式的形式寫成簡單賦值形式或更易理解的形式。比如把上述四元式序列寫成:
(1)t1∶=b*c
(2)t2∶=b*d
(3)t3∶=t1+t2
(4)a∶=t3
把(jump,-,-,L)寫成goto L
把(jrop,B,C,L)寫成if B rop C goto L
好,下面分析一下a<b
這是一個表達式,它的結果要麼是0,要麼是1,因為沒有指定這個表達式存放在哪,所以需要一個臨時變數來存放它的,在你的問題中,就是T。很顯然T有2個值:0或者1
因此,有
101 T:=0 (這個是表達式為假的出口)
103 T:=1 (這個是表達式為真的出口)
因為你的表達式只有一個A<B,因此A<B的真假出口就是表達式的真假出口,所以
100: if a<b goto 103 (a<b為真,跳到真出口103)
101: T:=0(否則,進入假出口)
102: goto 104 (當然要跳過真出口羅,否則T的值不就又進入真出口了,變成真了)
103: T:=1
104:(程序繼續執行)
C. a*(b*c+d*e)+a,編譯原理
逆波蘭式又稱為後綴表達式。
a*(b*c+d*e)+a
->(a*(b*c+d*e))a+
->(a(b*c+d*e)*)a+
->(a((b*c)(d*e)+)*)a+
->(a(bc*de*+)*)a+
->abc*de*+*a+
三元式:
(*,b,c)
(*,d,e)
(+,1,2)
(*,a,3)
(+,4,a)
四元式:
(*,b,c,T1)
(*,d,e,T2)
(+,T1,T2,T3)
(*,a,T3,T4)
(+,T4,a,T5)
抽象語法樹: