概念
通常將
運算符寫在運算量之間,例如a+b,這種表示法稱為中綴表示法。後綴表示法又稱逆波蘭表示法,它是波蘭邏輯學家盧卡西維奇發明的一種表示表達式的方法。這種表示法把運算量寫在前面,把運算符寫在後面(後綴),例如a+b寫作ab+,a+b*c寫作abc*+,(a+b)*c寫作ab+c*等等。一般而言,若θ是一個k(k≥1)目運算符,它對k個運算量(廣義地說是k個後綴式)
作用的結果將被表示成
。這種表示法不帶括弧,根據運算量和運算符出現的先後位置以及每個運算符的目數,就完全決定了一個表達式的計算順序。後綴表示法的特點是:
(1)運算量的排列順序與中綴表示法相同;
(2)運算符是按運算的順序排列的;
(3)運算符緊跟在被運算的對象之後出現。
後綴表示法雖然不符合人的習慣,但對計算機來說,可以很容易地使用一個棧來計算它的值或轉換成另一種代碼。因此,它便成了編譯過程中翻譯表達式的另一種常用的中間代碼形式。
工作原理
語法制導生成後綴式
(1)利用算符優先分析法進行語法分析。
首先,為分析過程設定一個一維數組POST來暫存後綴式,並置下標k=1。假定算符優先分析表已造好,就可利用通用算符優先分析算法進行語法分析、在對素短語進行歸約時,執行如上的語義子程式,便可獲得表達式的後綴表示。
(2)利用優先函式進行語法制導翻譯。
假定表達式的優先函式如下表所示:
| + | * | ↑ | i | ( | ) | # |
f | 6 | 8 | 8 | 12 | 2 | 11 | 1 |
g | 4 | 7 | 10 | 10 | 10 | 2 | 1 |
除了下推棧外,我們也設定了一個一維數組POST存放後綴式,並令下標t=1;POST[t]=0;下推棧的初始指針k=1;S[K]=#。
後綴表示法的計值或產生中間代碼
利用後綴式計值的過程是:自左至右掃描後綴式,每碰到運算量就把它推進棧,每碰到k目算符就把它作用於棧頂的k項,並用運算結果來代替這k項。
例如,考慮後綴式ab+c*的計值過程,它的步驟是:
(1)把a推進棧;
(2)把b推進棧;
(3)將棧頂兩項相加,並從棧中彈出這兩項,將相加結果壓入棧;
(4)把c推進棧;
(5)將棧頂兩項相乘,並從棧中彈出這兩項,將相乘結果壓入棧。
最後,在棧頂只留下該表達式計算結果。若要生成某中間代碼,只需對上述過程作少許改動,其算法可寫作:自左至右掃描後綴式,每碰到運算量就把它推進棧,每碰到k目算符,就將它作用於棧頂的k項,並生成相應的中間代碼,且以結果的臨時變數序號代替該棧頂的k項。