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