編譯6語法制導(dǎo)翻譯技術(shù)和中間代碼生成_第1頁
編譯6語法制導(dǎo)翻譯技術(shù)和中間代碼生成_第2頁
編譯6語法制導(dǎo)翻譯技術(shù)和中間代碼生成_第3頁
編譯6語法制導(dǎo)翻譯技術(shù)和中間代碼生成_第4頁
編譯6語法制導(dǎo)翻譯技術(shù)和中間代碼生成_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、編譯原理編譯原理(第三版第三版) 陳火旺等編著22022-5-21 主主 要要 內(nèi)內(nèi) 容容 屬性文法。屬性文法。 語法制導(dǎo)翻譯法的思想語法制導(dǎo)翻譯法的思想 常見中間代碼:逆波蘭表示、四元式表示常見中間代碼:逆波蘭表示、四元式表示和三地址代碼、三元式和樹形表示和三地址代碼、三元式和樹形表示 各種不同語法結(jié)構(gòu)的語法制導(dǎo)翻譯技術(shù)各種不同語法結(jié)構(gòu)的語法制導(dǎo)翻譯技術(shù)語法制導(dǎo)翻譯技術(shù)和中間代碼生成語法制導(dǎo)翻譯技術(shù)和中間代碼生成32022-5-216.1 概述概述一、語義分析的任務(wù)一、語義分析的任務(wù)審查每一個語法結(jié)構(gòu)的靜態(tài)語義,即驗證語法正確的結(jié)構(gòu)是否有意義。如:賦值語句:x=x+y,左邊變量類型與右邊變量

2、類型是否一致。1.在語義正確的基礎(chǔ)上生成一種中間代碼或目標(biāo)代碼。42022-5-21二、語義分析的范圍二、語義分析的范圍1.確定類型:確定標(biāo)識符所關(guān)聯(lián)的數(shù)據(jù)類型。2.類型檢查:按語言的類型規(guī)則,檢查運算的合法性與運算分量類型的一致性,必要時作類型轉(zhuǎn)換。3.識別含義:根據(jù)語言的語義定義(形式或非形式),識別程序中各構(gòu)造成分組合到一起的含義,并作相應(yīng)的語義處理(生成中間代碼或目標(biāo)代碼)4.控制流檢查:控制流語句必須轉(zhuǎn)移到合法的地方。如:C中,break語句規(guī)定跳出最內(nèi)層的循環(huán)或switch語句.52022-5-215.一致性檢查:在很多場合要求對象只能被說明一次(避免重復(fù)定義)。6.相關(guān)名字檢查:

3、如:Ada,循環(huán)或塊可以有一個名字,它出現(xiàn)在這些結(jié)構(gòu)的開頭或結(jié)尾。編譯程序必須檢查這兩個地方用的名字是否相同。62022-5-21三、語義描述工具和語義分析方法三、語義描述工具和語義分析方法語義描述工具 目前流行:用屬性文法屬性文法作為描述語義的工具。語義分析方法根據(jù)描述屬性文法的語義規(guī)則的方式不同,語義分析方法分為:n語法制導(dǎo)定義方法1.翻譯方案72022-5-216.2 屬屬 性性 文文 法法一、屬性一、屬性屬性常用來描述事物或人的特征。如:人的姓名,性別等,商品的顏色、重量、單位等。n屬性屬性:在編譯中,對文法的每一個符號,引進(jìn)一些屬性,用這些屬性描述文法符號相關(guān)的信息,如:類型、值或存

4、儲位置等。如:AX ,在語法推導(dǎo)或歸約時,有時結(jié)合X的類型,位置,值,考慮語法分析的正確性,即語法分析中有語義檢查。如:X的屬性:Xtype,Xplace,Xval分別表示X的類型,位置,值等語義。82022-5-21n屬性值:可以在語法分析過程中計算和傳遞。n屬性的加工過程就是語義的處理過程。二、屬性文法二、屬性文法n語義規(guī)則語義規(guī)則在對文法符號屬性處理過程中,必須遵守一定義的規(guī)則語義規(guī)則。為文法的每一產(chǎn)生式定義一組屬性的計算規(guī)則,稱為語義規(guī)則語義規(guī)則。n屬性文法屬性文法形式定義:一個屬性文法是一個三元組A,A=(G,V,F)其中:G為一個上下文無關(guān)文法; V 表示屬性的有窮集合; F表示屬

5、性的斷言或謂詞的有窮集。92022-5-21n在屬性文法中:每個屬性與文法中某個符號相關(guān)聯(lián),用“符號屬性”表示。如:Xtype, Xint, Xbool等。每個斷言與文法的某產(chǎn)生式相關(guān)聯(lián)。 斷言就是產(chǎn)生式上定義的一組語義規(guī)則。例:一個簡單表達(dá)式方法:EN1+N2 | N1orN2Nnum|true|false102022-5-21n根據(jù)程序語言中有關(guān)類型的檢驗原則,可以得到關(guān)于類型檢驗的屬性文法:EN1+N2 N1.type=int and N2.type=intEN1orN2 N1.type=bool and N2.type=boolNnum N.type=intNtrue N.type=b

6、oolNfalse N.type=bool112022-5-21n屬性分類:綜合屬性 繼承屬性綜合屬性:從語法分析角度看,如果一個結(jié)點的某一屬性,其值由子結(jié)點的屬性的值來計算,稱該屬性為綜合屬性。繼承屬性:在語法分析樹中,結(jié)點的某個屬性值由該結(jié)點的兄弟結(jié)點和(或)父結(jié)點的屬性值來計算,此結(jié)點的屬性稱為繼承屬性。繼承屬性用于“自上而下”傳遞信息、 綜合屬性用于“自下而上”傳遞信息。122022-5-21n注意:注意:終結(jié)符號只有綜合屬性,他由詞法分析器提供。非終結(jié)符號既有綜合屬性,也可有繼承屬性。文法識別符號(開始符號)的所有繼承屬性作為屬性計算前的初始值。根據(jù)處理不同的要求,屬性和斷言可以多種

7、形式出現(xiàn),如:語義規(guī)則或者程序段等。132022-5-21【例6.1】簡單表達(dá)式求值的屬性文法。 產(chǎn)生式語義規(guī)則LEprint(E.val)EE1+TE.val=E1.val+T.valETE.val=T.valTT1*FE.val=T1.val*F.valTFT.val=F.valF(E)F.val=E.val1.FdigitF.val= digit.lexval142022-5-21【例6.2】描述說明語句中簡單變量類型信息的屬性文法產(chǎn)生式產(chǎn)生式語義規(guī)則語義規(guī)則DTLL.in=T.typeTintT.type =integerTrealT.type =real LL1,id L1.in=L

8、.inaddtype(id.entry,L.in)1.Lidaddtype(id.entry,L.in)152022-5-21文法定義了一種說明語句,該說明語句的形式是由關(guān)鍵字int或real開頭,后跟一個標(biāo)識符表,每一個標(biāo)識符間用逗號隔開:real id1,id2,idn 或 int id1,id2,idn屬性文法中,非終結(jié)符T有綜合屬性type,其值由關(guān)鍵字int和real決定。n語義規(guī)則L.in=T.type將L的屬性值置為該說明語句指定的類型。 L.in將被沿著語法樹傳遞到下邊的結(jié)點使用,與L產(chǎn)生式相聯(lián)的規(guī)則里使用了它。如:句子int id1,id2語法樹: D T L L int ,

9、 id2 id1 162022-5-21一、基本思想對文法中的每個產(chǎn)生式都附加上一個語義動作或語義子程序,伴隨著語法分析,每當(dāng)使用一條產(chǎn)生式進(jìn)行推導(dǎo)或歸約時,就執(zhí)行相應(yīng)產(chǎn)生式的語義動作(包括:查填表格,改變變量的求值,打印信息和生成中間代碼等),從而完成預(yù)定的翻譯工作。即在語法翻譯過程中伴隨部分語義的檢查工作。6.3 語法制導(dǎo)翻譯概述語法制導(dǎo)翻譯概述172022-5-21n語法制導(dǎo)翻譯方法:自底向上的語法制導(dǎo)翻譯方法自頂向下的語法制導(dǎo)翻譯方法二、語法制導(dǎo)翻譯的步驟1、為所給文法每個產(chǎn)生式設(shè)計相應(yīng)的語義規(guī)則。例:為一個簡單表達(dá)式計值的文法:EE+E|E*E|(E)|digit設(shè)計簡單計算的語義規(guī)

10、則如下:1. EE(1)+E(2)Eval=E(1)val + E(2)val 2. EE(1)*E(2)Eval=E(1)val * E(2)val 3. E(E(1)Eval=E(1)val4. EdigitEval=lexdigit為文法產(chǎn)生式寫語義規(guī)則或語義子程序為文法產(chǎn)生式寫語義規(guī)則或語義子程序是難點.182022-5-212.采用LR分析方法,則構(gòu)造LR分析表192022-5-213. 將原LR語法分析棧擴(kuò)充,增加語義值棧。4. 根據(jù)語義分析棧的工作過程設(shè)計總控程序,使語法分析與語義分析工作同時完成。例例:計算表達(dá)式7+8*5的語法樹,以及用LR語法制導(dǎo)翻譯法得到該表達(dá)式的計值過程

11、:202022-5-21 7 + Eval=47 Eval=7 Eval=40 + Eval=8 Eval=5 8 5 注:自底向上語法制導(dǎo)翻譯的特點:當(dāng)棧頂形成句柄執(zhí)當(dāng)棧頂形成句柄執(zhí)行歸約時,調(diào)用相行歸約時,調(diào)用相應(yīng)的語義動作應(yīng)的語義動作。語法分析與語義分語法分析與語義分析同步操作。析同步操作。*212022-5-211 中間語言n中間語言:它介于源程序到目標(biāo)語言程序中間程序的語言n中間語言程序:用中間語言表示的程序。n作用:用于編譯程序,將源程序翻譯成等價的中間語言程序,再將中間語言程序轉(zhuǎn)化成目標(biāo)程序(即將語義分析和目標(biāo)代碼生成分開處理)n源程序 中間語言程序目標(biāo)程序n中間語言是表示語法制

12、導(dǎo)翻譯的結(jié)果。等價變換轉(zhuǎn)化6.4 6.4 中中 間間 語語 言言222022-5-21好處:n中間語言與機(jī)器無關(guān),使采用中間語言進(jìn)行翻譯的編譯程序系統(tǒng)易于移植。n易于優(yōu)化翻譯后的代碼。n使編譯程序的結(jié)構(gòu)在邏輯上更簡單明確。2 中間語言的表示常見:逆波蘭表示 四元式表示和三地址代碼 三元式和樹形表示232022-5-216.4.1 逆波蘭表示逆波蘭表示 由波蘭邏輯學(xué)家J.Lukasiewicz(盧卡西維茲)首先提出用來表示表達(dá)式的方法,后來推廣到表示程序設(shè)計語言中的其它語法成分。n表達(dá)式的逆波蘭表示表達(dá)式的逆波蘭表示表達(dá)式的表示:n中綴表示:運算符居中,運算對象在左右兩邊:a+bn波蘭表示:前綴

13、表示:運算符在前,運算對象在后:+ab后綴表示:運算對象在前,運算符在后:ab+(逆波蘭表示)242022-5-21n例:逆波蘭表示的例子252022-5-21(1)表達(dá)式逆波蘭表示的定義: 設(shè)E是一般表達(dá)式,則: 一般表達(dá)式一般表達(dá)式逆波蘭表達(dá)式逆波蘭表達(dá)式n若E為變量或常量En(E)E的逆波蘭式nE(1)opE(2)(二目運算)E(1)的逆波蘭式E(2)的逆波蘭式opnopE(單目運算)E的逆波蘭式op262022-5-21 在編譯過程中,生成逆波蘭表示的語義規(guī)則描述: 產(chǎn)生式 語義規(guī)則 EE(1)opE(2) E.code=E(1).code|E(2) .code|op E(E(1) )

14、 E.code=E(1) .code Ei E.code= i 其中:E.code表示E的逆波蘭式;|表示逆波蘭式的連接。272022-5-21 (2)逆波蘭表示的特點a.標(biāo)識符(運算對象)出現(xiàn)的順序(從左到右)和原有順序相同。b. 運算符是按實際計算順序(從左到右)出現(xiàn)的。c. 運算符緊跟在運算對象的后面出現(xiàn),并且沒有括號。282022-5-21(3) 好處:易于對表達(dá)式的計算處理n對于一般表達(dá)式的計算,系統(tǒng)需要用兩個工作棧分別處理運算對象和運算符。n對于逆波蘭表示的表達(dá)式計算處理只用一個工作棧。例:逆波蘭式ab+c*的計算處理過程遇運算對象a,b入棧掃描ab+c*棧遇運算符+取出a,b,運

15、算結(jié)果T入棧c*遇運算對象c入棧取出c,T作運算,設(shè)結(jié)果T1遇運算符*292022-5-212. 形成逆波蘭表示怎樣將一般表達(dá)式轉(zhuǎn)換成逆波蘭表示?基本思想基本思想:從左到右掃描表達(dá)式,每遇到:1o 表達(dá)式中的運算對象則往左去。2o 表達(dá)式中的運算符,則與運算符棧頂元素比較優(yōu)先數(shù):302022-5-21逆波蘭表示表達(dá)式運算對象運算符進(jìn)棧出棧運算符棧 如果運算符棧頂元素的優(yōu)先數(shù)大于或等于表達(dá)式中當(dāng)前的運算符優(yōu)先數(shù),則棧頂元素退棧向左去。然后當(dāng)前運算符繼續(xù)與棧頂?shù)男略乇容^優(yōu)先數(shù)。直到棧頂元素的優(yōu)先數(shù)小于表達(dá)式中當(dāng)前運算符為止。此時,才將表達(dá)式中當(dāng)前運算符進(jìn)棧。312022-5-21例:畫出形成表達(dá)

16、式a*(b+c/d)的逆波蘭表示過程a*(b+c/d)#步驟a(b+c/d)#*#步驟ab+c/d)#(*#步驟ab+c/d)#(*#步驟abc/d)#+(*#步驟abc/d)#+(*#步驟322022-5-21abcd)#/+(*#步驟abcd)#/+(*#步驟/+(*#abcd/)#步驟+(*#abcd/+)#步驟 *#abcd/+*#步驟332022-5-21形成逆波蘭表示的過程,實質(zhì)上是表達(dá)式的翻譯過程。(算法不難寫出)例:a/b/c+d = ab/c/d+(a+b)*(c-d/e) = ab+cde/-*342022-5-216.4.2 三元式和樹形表示三元式和樹形表示1. 三元式一

17、個三元式由三個主要部分和一個序號組成:(i)(op,arg1,arg2)其中:op是運算符,arg1和arg2是運算對象。當(dāng)op為一目運算符時,只有一個運算對象。(i)表示三元式的序號,三元式的運算結(jié)果由每個三元式前序號(i)指示。序號(i)指向三元式所處的表格位置,因此引用一個三元式的計算結(jié)果是通過引用該三元式的序號實現(xiàn)的。三元式出現(xiàn)的先后順序與表達(dá)式的計值順序一致。352022-5-21例:a=A+(-B)*C 的三元式:(1)(,B,-)(2)(*,(1),C)(3)(+,A,(2)362022-5-212. 間接三元式由于三元式的先后順序決定了值的順序,因此在產(chǎn)生三元式形式的中間代碼后

18、,對其進(jìn)行代碼的優(yōu)化時難免涉及到改變?nèi)降捻樞?這就要修改三元式表。為了最少改動三元式表,可以另設(shè)一張間接碼表來表示有關(guān)三元式在三元式表的計值順序,用這種辦法處理的中間代碼稱為間接三元式。例:表達(dá)式x=A+B*Cy=D-B*C372022-5-21其間接三元式表示如下:由于間接碼表的作用,編譯程序每產(chǎn)生一個三元式時,先查看三元式表中是否存在當(dāng)前三元式,若存在就不需要重復(fù)填寫三元式表,如上例中的三元式(1) (*,B,C)在間接碼表中出現(xiàn)了兩次,但三元式表中實際只有一個三元式。注:間接三元式表示的中間代碼有利于中間代碼的優(yōu)化。382022-5-213.樹形表示樹形表示n樹形結(jié)構(gòu)是三元式的另一種

19、表示形式例如:a=-b*c+b*d的樹形表示(由三元式的下至上畫出) = + a b * * c - d b 392022-5-21v一個表達(dá)式中簡單變量或常數(shù)的樹形表示就是它們的本身。v如果表達(dá)式e1和e2的樹分別為T1和T2,則: e1+e2, e1* e2, -e1 的樹分別: + T2 T1 e1+e2 * T2 T1 e1*e2 - T1 -e1 樹形表示法很容易表示一個表達(dá)式或語句。402022-5-21注注:二目運算對應(yīng)二叉樹三目運算對應(yīng)三叉樹: 如條件語句if u then S1 else S2 可看作三目運算。 其三目運算符定義為:if then else 則樹表示: S2

20、u S1 注:多叉樹不便于存儲,可以化為二叉樹: S1 S2 u new 412022-5-21四、四元式和三地址代碼四、四元式和三地址代碼四元式是一種比較普遍采用的中間代碼形式。n四元式由四個部分組成:(i) (op, arg1, arg2, result)其中:op為運算符;arg1,arg2為運算對象。result存放結(jié)果的變量。四元式之間的聯(lián)系通過變量來聯(lián)系(而不是三元式中的序號聯(lián)系)例:a=b*c+b/d 的四元式表示:(1) (*, b, c, t1)(2) (/, b, d, t2)(3) (+, t1, t2, t3)(4) (=, t3, _, a)422022-5-21注:

21、四元式和三元式的主要不同在于:四元式之間的聯(lián)系通過中間引用的變量名實現(xiàn),而三元式之間的聯(lián)系通過三元式序號實現(xiàn)。 這說明要更改一張三元式表比較困難,它需要改變一系列的三元式的序號。四元式表的修改比較方便,調(diào)整四元式之間位置,不改變其中的參數(shù)。 因此:四元式和三地址代碼表示的中間代碼便于中間代碼的優(yōu)化。而三元式和樹不便于優(yōu)化。432022-5-21有時將四元式表示成更直觀的形式:三地址代碼v三地址代碼形式:x = a op b (賦值形式)與賦值語句的區(qū)別:其右邊最多只能有一個運算符。 例:上例的四元式寫成三地址代碼:(1) t1=b*c(2) t2=b/d (3) t3= t1+ t2(4) a= t3n三地址代碼表示的好處:表示中間代碼更直觀,有利于中間代碼的優(yōu)化和目標(biāo)代碼的生成。442022-5-21n四元式的生成算法與逆波蘭式生成算法基本相同。n擴(kuò)充四元式可表示程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論