資源描述:
《語法制導翻譯和中間代碼生成》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、語法制導翻譯和中間代碼生成詞法分析和語法分析之后的中間代碼生成,是編譯第三階段的工作。本章介紹幾種典型的中間代碼形式,以及產(chǎn)生它的算法。中間代碼的形式很多,如逆波蘭記號、樹形表示、三元式、四元式。他們都是介于單詞流與目標指令之間的“中間產(chǎn)品”。困難目前還不存在一種廣泛接受的方式來描述為典型程序語言產(chǎn)生中間代碼所需的鄰語言的動作。原因是代碼生成依賴于對語義的解釋,而語義的刻劃的形式化系統(tǒng)尚未誕生。解決辦法為每一個產(chǎn)生式配一個翻譯子程序(語義子程序、動作),在語法分析的同時執(zhí)行它。這樣,配上語義動作之后,既指定了串
2、的意義,同時又按這種意義規(guī)定了生成某種中間代碼應作的基本動作。本章內容語法制導翻譯逆波蘭表示法三元式和樹四元式簡單算術表達式和賦值句到四元式的翻譯布爾表達式到四元式的翻譯控制語句的翻譯數(shù)組元素的引用過程調用說明語句的翻譯自上而下分析制導翻譯概說在語法分析過程中,隨著分析的步步進展,根據(jù)每個產(chǎn)生式所對應的語義子程序(語義動作)進行翻譯(產(chǎn)生中間代碼)的辦法。概念5.1語法制導翻譯概說標記說明描述語義動作時,需要賦予每個文法符號X(終結符或者非終結符)以種種不同方面的值,如X.TYPE(類型),X.VAL(值)等。
3、一個產(chǎn)生式中同一符號多次出現(xiàn),用上角標來區(qū)分。E?E+E表示為E?E(1)+E(2)每個產(chǎn)生式的語義動作,寫在該產(chǎn)生式之后的花括號內。#--S0………XX.VALSm-1YY.VALSm文法符號,無須進棧,讓其進棧只是為了醒目。需要保存的某些語義信息。實際上為一個指示器,指向分析表的某一行。語法制導的一個具體實現(xiàn)先對LR分析器的棧作一些改進,加入語義值。STATEVALSYMTOP文法及其語義動作(0)S’?E{printE.VAL}(1)E?E(1)+E(2){E.VAL:=E(1).VAL+E(2).VAL
4、}(2)E?E(1)*E(2){E.VAL:=E(1).VAL*E(2).VAL}(3)E?(E(1)){E.VAL:=E(1).VAL}(4)E?n{E.VAL:=LEXVAL}上述的語義動作等于給出了計算由+、*組成的整數(shù)算術式的過程。其相應的程序段如下:(0)S’?EprintVAL[TOP](1)E?E(1)+E(2)VAL[TOP]:=VAL[TOP]+VAL[TOP+2](2)E?E(1)*E(2)VAL[TOP]:=VAL[TOP]*VAL[TOP+2](3)E?(E(1))VAL[TOP]:=V
5、AL[TOP+1](4)E?nVAL[TOP]:=LEXVAL若把語義動作改為產(chǎn)生中間代碼的動作,就能隨著分析的進展逐步生成中間代碼。大部分的編譯器都不直接產(chǎn)生目標代碼,雖然這是可以實現(xiàn)的,但是產(chǎn)生的代碼不是最優(yōu)的。因為這涉及到寄存器的分配問題,在語義分析階段,很難有效地分配它們。中間代碼的必要性波蘭邏輯學家盧卡西維奇(Lukasiewicz)發(fā)明的一種表示法。一般,若e1,e2為任意的后綴表達式,Θ為任意雙目運算符,則用Θ作用于e1和e2所代表的結果用后綴式e1e2Θ表示。推而廣之,Θ為k目運算符,則Θ作用于
6、e1e2…ek的結果用e1e2…ekΘ來表示。概念5.2逆波蘭表示法a*(b+c)?abc+*(a+b)*(c+d)?ab+cd+*若用?表示if-then-else,則Ifathenifc-dthena+celsea*celsea+b?acd-ac+ac*?ab+?示例后綴式求值使用一個棧(軟件棧或者硬件棧)來求值。求值過程:從左到右掃描后綴式,每碰到運算量就把它推進棧,每碰到k目運算符就把它作用于棧頂?shù)膋個項,并用運算結果來代替這k個項。ab+c*的求值(a=1,b=3,c=5)a進棧13+5*b進棧ab相
7、加,移去兩項,和置于棧頂43+1=c進棧棧頂兩項相乘,移去兩項,積置于棧頂5*4=20計算完畢,結果為20后綴式的控制流前面講到,if-then-else運算符的實現(xiàn)”exy?”?e不等于0,取x,否則取y.這種表示法要求在任何情況下都要把x,y都計算出來,盡管只用到其中一個。而且,如果運算量無定義或者有副作用,則后綴表示法不僅無效,而且可能是錯誤的。解決方案引入標號,在后綴式中加入條件轉移,無條件轉移算符。存儲方式后綴式存放在一維數(shù)組POST[1..N]中,每個元素是運算符或者分量(指向符號表)。pjump?
8、轉到POST[p]e1e2pjlt?e1