語法制導(dǎo)翻譯和中間代碼生成.ppt_第1頁
語法制導(dǎo)翻譯和中間代碼生成.ppt_第2頁
語法制導(dǎo)翻譯和中間代碼生成.ppt_第3頁
語法制導(dǎo)翻譯和中間代碼生成.ppt_第4頁
語法制導(dǎo)翻譯和中間代碼生成.ppt_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四、五章語法制導(dǎo)翻譯和中間代碼生成,概述,語法分析之后,編譯的任務(wù)是由已識別為正確的源程序生成一組規(guī)格一致,便于計算機加工的指令形式。 一、中間代碼生成方法 語法制導(dǎo)翻譯,屬性文法制導(dǎo)翻譯 中間代碼:不是機器語言,便于生成機器語 言,便于代碼優(yōu)化。,中間代碼的形式: 逆波蘭式 樹形表示法 三元式 四元式:最常用的形式,二、翻譯方法 1、屬性文法制導(dǎo)翻譯 將文法的終結(jié)符、非終結(jié)符及動作 符號附加以語義參數(shù),這些參數(shù)稱作為文法符號的屬性,從而構(gòu)成屬性文法。 注:1)在屬性文法中是利用各種屬性作為語義動作之間的通信介質(zhì) 2)一個文法符號可以和多個語義參數(shù)相關(guān)聯(lián),3)屬性可分為兩種:繼承屬性和綜合屬

2、性。繼承屬性值的計算規(guī)則是自上而下產(chǎn)生式右部符號的某些值是根據(jù)其左部符號的屬性和右部其它符號的某些屬性計算而得。 4)綜合屬性值的計算規(guī)則是自下而上產(chǎn)生式左部符號的某些屬性值是根據(jù)其右部符號的屬性和左部其它符號的某些屬性計算而得。 5)屬性翻譯的依據(jù)是屬性規(guī)則。 6)屬性規(guī)則嵌入在產(chǎn)生式右部適當(dāng)位置。,2、語法制導(dǎo)翻譯 在語法分析的基礎(chǔ)上進(jìn)行邊分析邊翻譯。 注:1)語法制導(dǎo)翻譯時會根據(jù)文法產(chǎn)生式右部符號串的含義,進(jìn)行翻譯,翻譯的結(jié)果是生成相應(yīng)中間代碼。 2)語法制導(dǎo)翻譯的依據(jù)是語義子程序。 3)具體做法:為每個產(chǎn)生式配置一個語義子程序,當(dāng)語法分析進(jìn)行歸約或推導(dǎo)時,調(diào)用語義子程序,完成一部分翻譯

3、任務(wù)。 4)語法分析完成,翻譯工作也告結(jié)束。,語法制導(dǎo)翻譯適用于多種語法分析。 語法制導(dǎo)翻譯種類 1、自上而下語法制導(dǎo)翻譯:對每個文法符號配以語義動作。 2、自下而上語法制導(dǎo)翻譯:我們主要討論LR語法制導(dǎo)翻譯。,三、語義子程序 1、作用 用來描述一個產(chǎn)生式所對應(yīng)的翻譯工作。 如:改變某些變量的值;查填各種符號表;發(fā)現(xiàn)并報告源程序錯誤;產(chǎn)生中間代碼等。 注:這些翻譯工作很大程度上決定了要產(chǎn)生什么形式的中間代碼。,2、寫法 語義子程序?qū)懺谠摦a(chǎn)生式后面的花括號內(nèi)。 Eg: X 語義子程序1 注:在一個產(chǎn)生式中同一個文法符號可能出現(xiàn)多次,但他們代表的是不同的語義值,要區(qū)分可以加上角標(biāo)。如:E E(1)

4、+E (2) 3、語義值 為了描述語義動作,需要為每個文法符號賦予不同的語義值:類型、地址、代碼值等。,4、語義棧 各個符號的語義值放在語義棧中 當(dāng)產(chǎn)生式進(jìn)行歸約時,需對產(chǎn)生式右部符號的語義值進(jìn)行綜合,其結(jié)果作為左部符號的語義值保存到語義棧中。 下推棧包含3部分: 狀態(tài)棧、符號棧和語義棧 注:語義棧與狀態(tài)棧和符號棧是同步變化的。,注: 1)若把語義子程序改成產(chǎn)生某種中間代碼的動作,就能在語法分析制導(dǎo)下,隨著分析的進(jìn)展逐步生成中間代碼。 2)若把語義子程序改成產(chǎn)生某種機器的匯編語言指令,就能隨著分析的進(jìn)展逐步生成某機器的匯編語言代碼。,例如: 產(chǎn)生式 語義子程序 (0)S E PRINT EVA

5、L (1)E E (1)+E(2) EVAL= E (1) VAL +E(2) VAL (2)E E (1)*E(2) EVAL= E (1) VAL *E(2) VAL (3)E (E (1) EVAL= E (1) VAL (4)E i EVAL= LEXVAL 注:LEXVAL指的是詞法分析送來的機內(nèi)二進(jìn)制整數(shù),四、常見的中間代碼形式 1、四元式形式: (Operator,Operand1,Operand2,Result) 注: 1) Operand1,Operand2,Result 可能是用戶自定義的變量,也可能是編譯時引進(jìn)的變量。 這里Operator是雙目運算符,若只有一個運算量,

6、則是單目運算符。,2)四元式中變量采用符號表入口的地址,而不用變量的地址,因為語義分析不僅需要變量的地址,還需要從符號表查到的變量的屬性、類型和地址等。 3)四元式的優(yōu)點是容易轉(zhuǎn)換為目標(biāo)代碼和容易進(jìn)行優(yōu)化。,2、三元式 (Operator,Operand1,Operand2) 注: 1)這里三元式本身作為存放結(jié)果的單元。 2)為了在其它三元式中利用當(dāng)前三元式的結(jié)果,需要對三元式進(jìn)行編號。三元式的編號就作為相應(yīng)三元式的結(jié)果值。,3、后綴表示式(逆波蘭表達(dá)式) Operand1 Operand2 Operator 4、樹形表示法 注:常用中間代碼表示法是四元式。,賦值語句的翻譯,僅含簡單變量的表達(dá)

7、式的賦值語句的翻譯 1、賦值語句的文法 A i=E E E+E|E*E|-E|(E)|i 2、需要的語義過程 NEWTEMP函數(shù):每次調(diào)用送回一個代表新臨時變量的序號,可認(rèn)為是送回T1 、 T2這樣的一些臨時變量 ENTRY(i)函數(shù):用于查變量i的符號表入口地址,GEN(OP,ARG1,ARG2,RESULT)過程:產(chǎn)生一個四元式,并填入四元式序列表。 3、需要的語義變量 EPLACE:與非終結(jié)符E相聯(lián)系的語義變量 值為某變量的符號表入口地址或臨時變量序號。 它與文法的非終結(jié)符相聯(lián),分析過程需要就建立,不需要就消亡。,產(chǎn)生式 語義子程序 (1)A i=E GEN(=, EPLACE ,_,E

8、NTRY(i) (2)E -E (1) T=NEWTEMP; GEN(, E(1)PLACE ,_,T); EPLACE =T (3)E E (1)*E(2) T=NEWTEMP; GEN(*, E(1)PLACE , E(2)PLACE ,T); EPLACE =T (4)E E (1) + E(2) T=NEWTEMP; GEN(+, E(1)PLACE , E(2)PLACE ,T); EPLACE =T (5)E (E (1) EPLACE =E(1)PLACE (6)E i EPLACE = ENTRY(i),注: 1、符號棧是為了介紹才列出的,實際上并不存在。 2、由于語義分析是在

9、語法分析的過程中進(jìn)行的,所以狀態(tài)棧實際上是需要的,這里沒有寫出來。 3、這個分析過程是針對整型變量做的。實際上在一個表達(dá)式中,可能出現(xiàn)各種不同類型的變量或常量,所以,編譯程序要么拒絕接受某種混合運算,要么能產(chǎn)生有關(guān)類型轉(zhuǎn)換的指令。,二、類型轉(zhuǎn)換 對于表達(dá)式文法中的i既是實型又可以是整型。 對這種混合運算,我們要先把整型量轉(zhuǎn)化為實型量,就需要為每個非終結(jié)符的語義值添加類型信息,用EMODE表示非終結(jié)符E的類型信息。 1、定義各非終結(jié)符的類型信息 產(chǎn)生式E E (1) op E(2)的語義動作中要加入關(guān)于EMODE的語義規(guī)則的定義: IF E (1)MODE=int AND E (2)MODE=i

10、nt THEN EMODE=int ELSE E MODE=r,2、對運算量進(jìn)行類型轉(zhuǎn)換 例如:X=Y+I*J,其中X、Y是實型, I、J是整型。其四元式為: (*i,I,J,T1) (itr,T1,_,T2) (+r,Y , T2,T3) (=,T3,_,X),注: 1)對運算符也要指出相應(yīng)的類型(運算符上加角標(biāo)),說明是定點還是浮點運算。 2)由于非終結(jié)符E的語義值有EPLACE 和EMODE 兩個,這兩者都要保存在語義棧中。 3)在運算量的類型較多的情況下,需要仔細(xì)推敲語義規(guī)則,否則語義子程序會變得累贅不堪。,布爾表達(dá)式的翻譯,一、布爾表達(dá)式在程序設(shè)計語言中的作用 用作控制語句中的條件表

11、達(dá)式; 用于邏輯賦值語句中布爾表達(dá)式演算。 二、布爾表達(dá)式的組成 由布爾算符作用于布爾變量(或常量)或關(guān)系表達(dá)式而形成的。 布爾算符:, 關(guān)系表達(dá)式的形式: E (1) rop E(2) ,其中rop是關(guān)系運算符(如,=,), E (1) 和E(2)是算術(shù)表達(dá)式,三、布爾表達(dá)式文法: G(B): E EE | EE | E | (E) | i | Ea rop Ea i為布爾變量或常量; Ea為算術(shù)表達(dá)式。 注: 1)此文法為二義文法,一般布爾算符的優(yōu)先順序為: ,; 且,服從左結(jié)合律;關(guān)系運算優(yōu)先級別高于布爾運算。 2)由于布爾表達(dá)式有兩種用途,所以有兩種不同的翻譯方法。,四、布爾表達(dá)式在邏

12、輯演算中的翻譯 1、語義子程序 由于布爾表達(dá)式演算與算術(shù)表達(dá)式計算非常類似,可以仿照算術(shù)表達(dá)式的翻譯方法,為每個產(chǎn)生式寫出語義子程序:,產(chǎn)生式 語義子程序 (1)EEa(1) rop Ea(2) T=NEWTEMP; GEN(rop, Ea(1)PLACE , Ea(2)PLACE ,T); EPLACE =T (2)E E (1) bop E(2) T=NEWTEMP; GEN(bop, Ea(1)PLACE , Ea(2)PLACE ,T); EPLACE =T (3)E E (1) T=NEWTEMP; GEN(, E(1)PLACE , _ ,T); EPLACE =T (4)E (E

13、 (1) EPLACE =E(1)PLACE (5)E i EPLACE = ENTRY(i),2、實例:對布爾式X+YZA(BC)進(jìn)行翻譯: 解:語法制導(dǎo)得翻譯是在語法分析的過程中進(jìn)行的,若利用G(B)文法的LR分析表對上句進(jìn)行LR分析,在其過程中進(jìn)行語義分析;則得到的四元式序列是: (+,X,Y,T1) ;E+E進(jìn)行歸約,識別了算術(shù)運算 (, T1,Z, T2) ; E E進(jìn)行歸約,識別了關(guān)系運算 (,B,_, T3) ; E歸約 (, T3,C, T4) ; EE進(jìn)行歸約 (,A, T4,T5) ; EE進(jìn)行歸約 (, T2, T5, T6) ; EE進(jìn)行歸約,五、控制語句中布爾式的翻譯

14、 1、 控制語句中的布爾式并不需要計算表達(dá)式的值,只用if-then-else來解釋,以來控制程序流向。 if E then S1 else S2,2、控制語句中布爾式E翻譯成的四元式為以下三種: (jnz,A1,_,P) If A1 then goto P (j,A1, A2,P) If A1A2 then goto P (j, _, _ ,P) Goto P 注:這些四元式都是轉(zhuǎn)移四元式,其中P為出口的四元式序號。與E的真假值相對應(yīng)的分別為“真出口”和“假出口”兩類四元式。,例如:把語句if ABD then S1 else S2 翻譯成 四元式 解: (1)(jnz,A,_,(5) ;真

15、出口;若A為真,執(zhí)行S1代碼 (2)(j,_,(3) ;若A為假,看右邊的表達(dá)式值 (3)(j,B,D,(5) ;真出口; 右邊的表達(dá)式值為真 (4)(j,_,_,(P+1) ;假出口; 右邊的表達(dá)式值為假 (5) S1語句的第一個四元式 (P)(j,_,_,(q) ;執(zhí)行完S1代碼后跳過S2代碼段 (p+1) S2語句的第一個四元式 (q)此語句的后繼語句,注:1、上面的14式是由布爾式“ABD”產(chǎn)生的中間代碼,但它們和邏輯演算中的翻譯不同,消除了布爾運算,變成轉(zhuǎn)移四元式。 2、翻譯時每個布爾量是譯為兩個二元式的,但有些并不必要,所以可以在后續(xù)階段進(jìn)行優(yōu)化。 3、在自下而上的分析過程中,一個

16、布爾式的真假出口的轉(zhuǎn)向序號不可能在產(chǎn)生轉(zhuǎn)移四元式時就填上。此時將待填的轉(zhuǎn)移四元式暫時保留,等出口明朗了,在進(jìn)行回填。,3、對文法的改寫 原G(B): E EE | EE | E | (E) | i | Ea rop Ea 由于產(chǎn)生式E E(1)E(2)在E(1)i歸約時翻譯成兩個四元式,一個表示“真”轉(zhuǎn)移,一個表示“假”轉(zhuǎn)移; “假”轉(zhuǎn)移要轉(zhuǎn)到“”號后,即讀完“”就可以回填假出口,所以可以進(jìn)行產(chǎn)生式的改寫。 E E(1)E(2)改寫為E E0E(2) , E0 E(1) E E(1)E(2)改寫為E EAE(2) , EA E(1),故文法改寫為:G(B): E EAE | E0E | E |

17、 (E) | i | Ea rop Ea EA E E0 E,4、增加語義值: 由于歸約每個非終結(jié)符時,產(chǎn)生兩個四元式,分別對應(yīng)于其語義為真和為假的情況,所以為了實現(xiàn)對轉(zhuǎn)移四元式的拉鏈和回填,為每個非終結(jié)符賦予兩個語義值:ETC、 EFC。 ETC 、 EFC分別記錄非終結(jié)符E需要回填“真”、“假”出口四元式的序號所構(gòu)成的鏈。 ETC 、 EFC的值也可以放在語義棧中,即下推棧又增加了兩欄。,5、文法G(B)各產(chǎn)生式的語義子程序 文法: E EAE | E0E | E | (E) | i | Ea rop Ea EA E E0 E 語義子程序: (1) E i ETC=NXQ; EFC=NXQ

18、+1; GEN(jnz,ENTRY(i),_,0); GEN(j,_,_,0) 注:將布爾型操作數(shù)進(jìn)行歸約,產(chǎn)生兩個四元式;無論真假都不知該轉(zhuǎn)到哪個四元式上去,故轉(zhuǎn)向0。,例如: 將控制語句中的ABD翻譯成四元式 解: (1)(jnz,A,_,0) ;真出口; (2)(j,_,_,0) ;若A為假,看右邊的表達(dá)式值 TC:1; FC:2;,(2) E Ea rop Ea ETC=NXQ; EFC=NXQ+1; GEN ( jrop, Ea(1)PLACE, Ea(2)PLACE,0); GEN(j,_,_,0),例如: 將控制語句中的ABD 翻譯成四元式 解: (1)(jnz,A,_,0) ;

19、真出口 (2)(j,_,_,(3) ;若A為假,看右邊的表達(dá)式值 (3)(j,B,D,0) ;真出口; 右邊的表達(dá)式值為真 (4)(j,_,_,0) ;假出口; 右邊的表達(dá)式值為假 ETC:3; EFC:4;,(8) EE0E(2) EFC= E(2)FC; ETC=MERG(E0TC,E(2)TC 注:由于E的真假決定于E(2) ,所以E(2)為假時它們的轉(zhuǎn)移相同;由于E(1) 或E(2)為真時都導(dǎo)致E為真,所以它們?yōu)檎娴那闆r要合并起來。,例如: 將控制語句中的ABD翻譯成四元式 解: (1)(jnz,A,_,0) ;真出口 (2)(j,_,_,(3) ;若A為假,看右邊的表達(dá)式值 (3)(

20、j,B,D,0) ;真出口; 右邊的表達(dá)式值為真 (4)(j,_,_,0) ;假出口; 右邊的表達(dá)式值為假 ETC: 3 、 1; EFC:4;,FUNCTION MERG(p1,p2); IF p2=0 MERG=p1 ELSE p=p2; WHILE 四元式p的第4段內(nèi)容不為0 p=四元式p的第4段內(nèi)容; 把p1填進(jìn)四元式p的第四段; MERG=p2; 注:算法思想:找到p2的鏈尾,然后將p1連接到p2的鏈尾。,(3) E (E(1) ETC= E(1)TC; EFC= E(1)FC (4) E E(1) ETC= E(1)FC; EFC= E(1)TC (5)EA E(1) BACKPA

21、TCH(E(1)TC,NXQ); EAFC= E(1)FC; (6) EEAE(2) ETC= E(2)TC; EFC=MERG(EAFC,E(2)FC,例如:將布爾式ABC在語法制導(dǎo)下翻譯成四 元式。,控制語句的翻譯,一、控制語句的種類: 無條件轉(zhuǎn)移語句 條件語句 迭代語句 循環(huán)語句 分情語句,二、標(biāo)號和轉(zhuǎn)移語句(GOTO) 1、標(biāo)號 (1)標(biāo)號語句 GOTO語句實現(xiàn)無條件轉(zhuǎn)移,要確定轉(zhuǎn)移的目的語句,需要給語句加標(biāo)號。 帶標(biāo)號的語句形式:L:S L是標(biāo)號 (2)標(biāo)號的定義和使用: 先定義后使用L:S GOTO L 先使用后定義GOTO L L:S,2、先定義后使用 (1)形式:L:S GOT

22、O L (2)定義和使用標(biāo)號的文法: S goto L Label i: (3)翻譯過程: 當(dāng)遇到定義性的標(biāo)號語句時,將L歸約為Label,再將L填入符號表,如下:,S.QUAD :即S對應(yīng)的入口四元式序號。 當(dāng)后面遇到GOTO L語句時,便產(chǎn)生四元式: (j,p),其中p= S.QUAD,2、先使用后定義 (1)形式: GOTO L GOTO L GOTO L L:S (2)翻譯過程: 由于這里是先使用,所以當(dāng)遇到標(biāo)號L時,它還未定義,故而填入符號表時情況與上不同,表如下:,(a)填符號表:將定義否欄填“未”,地址欄暫填即將生成的四元式序號p,CAT欄填“標(biāo)號”; (b)生成四元式:(p)

23、(j,0),等待回填;,(c)當(dāng)遇到第2個使用性標(biāo)號L時,修改符號表,僅將L這一行的地址欄內(nèi)容修改為即將生成的四元式序號q; (d)生成四元式:(q) (j,p),其中第四段的p取自符號表的地址欄在修改前的內(nèi)容,即形成一個需要回填的鏈。不斷重復(fù)(c)(d)。,e)當(dāng)定義性語句L:S出現(xiàn)時,用S語句所對應(yīng)的第一個四元式序號回填這個鏈,即使用BACKPATCH 過程。 注:此鏈表的鏈?zhǔn)自诜柋淼南鄳?yīng)行的地址欄內(nèi)。 (3)形式化的語義子程序: 產(chǎn)生式 語義子程序 S goto L 程序1 Label i: 程序2,查符號表: 若L不在表中,在表中建L這行,CAT欄置標(biāo)號,定義否填未,地址為NXQ;G

24、EN(j,0); 若L在表中,但未定義,則:p=L.地址; L.地址為NXQ;GEN(j,p); 若L在表中,已定義,則:p=L.地址;GEN(j,p); ,查符號表: 若L不在表中,在表中建L這行,CAT欄置標(biāo)號,定義否填已,地址為NXQ; 若L已在表中,但定義否已填已或CAT標(biāo)號,則出錯; 否則,將定義否改為已; q=L.地址; BACKPATCH(q,NXQ); L.地址=NXQ; ,三、IF語句的翻譯 1、描述IF語句的文法 S if E then S(1) S if E then S(1) else S(2) 2、IF語句的翻譯 (1)完成對布爾式E的翻譯,獲得一組四元式,并留下兩個

25、待填的語義值ETC,E FC; (2)掃描完then之后就得到了E的真出口,用BACKPATCH(ETC,NXQ)過程回填; (3)翻譯S(1) ,它可能會是任何一種語句,總可以遞歸地調(diào)用語句翻譯過程來完成,得到一組四元式序列;,(4)若遇到else,表示S(1)已翻譯完,應(yīng)無條件生成一條GOTO四元式(j,0)轉(zhuǎn)到S(2)語句后面,以示這個IF語句已執(zhí)行結(jié)束。但這個無條件轉(zhuǎn)移語句究竟轉(zhuǎn)到什么地方去,是不確定的,甚至在翻譯完S(2)語句之后也不一定確定下來。遇到else還表示已獲得E的假出口 若不遇到else,那么布爾式的假出口與S(1)的結(jié)束出口都表示IF語句的結(jié)束。,(5)翻譯S(2)語句

26、成四元式序列。它執(zhí)行過后也表示IF語句應(yīng)該結(jié)束了,它的結(jié)束出口和S(1)是一樣的,可將它們出口并鏈,鏈?zhǔn)字糜赟CHAIN中。 故,條件語句翻譯之后,除了生成相應(yīng)E, S(1), S(2)的四元式之外,還剩下一個待填語句鏈,鏈?zhǔn)自赟CHAIN中,出口明確后按此回填。,3、改寫產(chǎn)生式 S if E then S(1) else S(2) 改寫為: C if E then T C S(1) else S T S(2) S if E then S(1) 改寫為: C if E then S C S(1),4、語義子程序 C if E then BACKPATCH(ETC,NXQ); CCHAIN=EF

27、C; T C S(1) else q=NXQ; GEN(j,0); BACKPATCH(CCHAIN,NXQ); T CHAIN=MERG(S(1)CHAIN,q) S T S(2) SCHAIN=MERG(TCHAIN,S(2)CHAIN) S C S(1) SCHAIN=MERG(CCHAIN,S(1)CHAIN),注: 1)這里的基本思想是拉鏈回填; 2)當(dāng)if E rhen歸約為C時,布爾式E已不在棧內(nèi),故其語義值E.FC也不復(fù)存在,但E.FC尚未回填,可將它暫存于非終結(jié)符C的CHAIN中,通過后來的拉鏈回填C.CHAIN,實際上就是對E.FC的回填; 3)語句翻譯完了,但SCHAIN

28、還沒回填,只有當(dāng)整個嵌套句全部翻譯完,才能進(jìn)行回填。,例如:翻譯條件嵌套語句: If a then if b then A:=2 else A:=3 Else if c then A=4 Else A=5 翻譯成四元式為:,可得四元式: (1)(jnz,a,_,3) (8)(j,_,_,6) (2)(j,_,_,9) (9)(jnz,c,_,11) (3)(jnz,b,_,5) (10)(j,_,_,13) (4)(j,_,_,7) (11)(:=,4,_,A) (5)(:=,2,_,A) (12)(j,_,_,8) (6)(j,_,_,0) (13)(:=,5,_,A) (7)(:=,3,_

29、,A),過程調(diào)用語句,一、過程調(diào)用 1、過程: 定義和調(diào)用過程是程序語言的主要特征之一。過程是模塊化程序設(shè)計的主要手段,同時也是節(jié)省程序代碼和擴充語言能力的主要途徑。 2、過程調(diào)用: 實質(zhì)是把程序控制轉(zhuǎn)到子程序。 3、過程調(diào)用中遇到的問題: 子程序完成后如何回到主調(diào)程序; 子程序回到主調(diào)程序時,運行環(huán)境的恢復(fù); 如何進(jìn)行參數(shù)傳遞;,二、參數(shù)傳遞 1、參數(shù) 實在參數(shù) 形式參數(shù) 2、傳遞方式 1)傳地址(call by reference):把實在參數(shù)的地址傳遞給相應(yīng)的形式參數(shù)。 2)傳值(call by value):把實在參數(shù)的值計算出來傳遞給相應(yīng)的形式參數(shù)。 3)傳名(call by nam

30、e):ALGOL 60 所定義的一種特殊的形實參結(jié)合方式。,3、傳地址: 1)基本方式 A)若實參是一個變量(包括下標(biāo)變量),則直接傳遞它的地址; B)若實參是一個常數(shù)或其他表達(dá)式,就把值計算出來并存放在某臨時單元中,然后傳遞這個臨時單元的地址。 2)傳址過程 A)當(dāng)程序控制轉(zhuǎn)入被調(diào)用過程之后,被調(diào)用段首先把實參地址從連接數(shù)據(jù)區(qū)中讀入形參單元中。 注:若已直接傳至形參單元,不做此步。,B)在過程體內(nèi),對形參的任何引用或賦值都被看作對形參單元的間接訪問。這間接賦值將直接修改實參單元的內(nèi)容。 4、傳值: 調(diào)用時把實在參數(shù)的值計算出來,把值直接傳送給形式單元中。在過程體中應(yīng)用這些單元不會修改實參單元

31、的值。 5、傳名 過程調(diào)用相當(dāng)于把被調(diào)用段的過程代替調(diào)用語句,并且過程體內(nèi)形參名皆用相應(yīng)的實參名代替。,三、過程調(diào)用語句的翻譯(傳址) 1、文法 S call i(Arglist) Arglist Arglist,E Arglist E 2、相關(guān)四元式 1)(par,_,_,T) 含義是:將參數(shù)T傳遞到一個公共的區(qū)域或直接傳遞到過程的形參單元 2)(jsr,_,n,S) 含義是:轉(zhuǎn)子指令,轉(zhuǎn)移到S過程的四元式入口序號,3、語義子程序 (1) S call i(Arglist) n=0; for( 隊列ArglistQUEUE中的每個p ) GEN(par,_,_,p); n=n+1; GEN(

32、jsr,_,n,ENTRY(i) (2) Arglist Arglist(1),E 把EPLACE添加入Arglist (1) QUEUE末端; ArglistQUEUE Arglist (1) QUEUE,(3) Arglist E 建立一個ArglistQUEUE空隊列; ArglistQUEUE 隊列頭; 將EPLACE添入隊列 注: ArglistQUEUE存放隊列頭指針,它存于QUEUE語義棧。 例如:過程調(diào)用:CALL S(A+B,Z)譯為: k (_,A,B,T) k+1 (par,_,_,T) k+2 (par, _,_,Z) k+3 (jsr, _,2,S),說明語句的翻譯,一、說明語句的編譯任務(wù) 1)登記符號表,包括填名字及有關(guān)屬性; 2)為變量分配內(nèi)存地址(相對地址),包括內(nèi)情向量表地址及構(gòu)造部分或全部向量表。 注:1)絕大多數(shù)程序語言的說明語句不產(chǎn)生中間代碼。 2)詞法分析雖然也查造符號表,但它不知道標(biāo)識符的屬性,對該標(biāo)識符所處的環(huán)境也一無所知,符號表很不成熟。,二、分程序結(jié)構(gòu)的符號表 某些高級語言允許過程遞歸調(diào)用和過程嵌套,這就需要建立分程序結(jié)構(gòu)。 1、這些語言的標(biāo)識符具有以下性質(zhì): 1)所有標(biāo)識符必須先定義后使用; 2)標(biāo)識符的使用遵守最小作

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論