編譯第七章語(yǔ)法制導(dǎo)翻譯.ppt
《編譯第七章語(yǔ)法制導(dǎo)翻譯.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《編譯第七章語(yǔ)法制導(dǎo)翻譯.ppt(108頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第七章語(yǔ)法制導(dǎo)翻譯和中間代碼生成,第一節(jié) 概述,語(yǔ)法分析之后,編譯的任務(wù)是由已識(shí)別為正確的源程序生成一組規(guī)格一致,便于計(jì)算機(jī)加工的指令形式。 一、中間代碼生成方法 語(yǔ)法制導(dǎo)翻譯,屬性文法制導(dǎo)翻譯 二、中間代碼 中間代碼:不是機(jī)器語(yǔ)言,便于生成機(jī)器語(yǔ)言,便于代碼優(yōu)化。 中間代碼的形式: -------逆波蘭式 -------樹形表示法 -------三元式 -------四元式:最常用的形式,第七章中間代碼的生成 1,第一節(jié) 概述,二、翻譯方法 1、語(yǔ)法制導(dǎo)翻譯 ----在語(yǔ)法分析的基礎(chǔ)上進(jìn)行邊分析邊翻譯。 注:1)語(yǔ)法制導(dǎo)翻譯時(shí)會(huì)根據(jù)文法產(chǎn)生式右部符號(hào)串的含義進(jìn)行翻譯,翻譯的結(jié)果是生成相應(yīng)中間
2、代碼。 2)語(yǔ)法制導(dǎo)翻譯的依據(jù)是語(yǔ)義子程序。 3)具體做法:為每個(gè)產(chǎn)生式配置一個(gè)語(yǔ)義子程序,當(dāng)語(yǔ)法分析進(jìn)行歸約或推導(dǎo)時(shí),調(diào)用語(yǔ)義子程序,完成一部分翻譯任務(wù)。 4)語(yǔ)法分析完成,翻譯工作也告結(jié)束。,第七章中間代碼的生成 2,第一節(jié) 概述,二、翻譯方法 1、語(yǔ)法制導(dǎo)翻譯 ---語(yǔ)法制導(dǎo)翻譯適用于多種語(yǔ)法分析 ---語(yǔ)法制導(dǎo)翻譯種類 1、自上而下語(yǔ)法制導(dǎo)翻譯:對(duì)每個(gè)文法符號(hào)配以語(yǔ)義動(dòng)作。 2、自下而上語(yǔ)法制導(dǎo)翻譯:我們主要討論LR語(yǔ)法制導(dǎo)翻譯,第七章中間代碼的生成 3,第一節(jié) 概述,三、語(yǔ)義子程序 1、作用 用來(lái)描述一個(gè)產(chǎn)生式所對(duì)應(yīng)的翻譯工作。 ---如:改進(jìn)某些變量的值;查填各種符號(hào)表;發(fā)現(xiàn)并報(bào)告
3、源程序錯(cuò)誤;產(chǎn)生中間代碼等。 注;這些翻譯工作很大程度上決定了要產(chǎn)生什么形式的中間代碼,三、語(yǔ)義子程序 2、寫法 語(yǔ)義子程序?qū)懺谠摦a(chǎn)生式后面的花括號(hào)內(nèi)。 X a語(yǔ)義子程序 注:在一個(gè)產(chǎn)生式中同一個(gè)文法符號(hào)可能出現(xiàn)多次,但它們代表的是不同的語(yǔ)義值,要區(qū)分可以加上角標(biāo)。 如: E E(1)+E(2) 3、語(yǔ)義值 為了描述語(yǔ)義動(dòng)作,需要為每個(gè)文法符號(hào)賦予不同的語(yǔ)義值:類型,地址,代碼值等。,第一節(jié) 概述,,,第一節(jié) 概述,三、語(yǔ)義子程序 4、語(yǔ)義棧 各個(gè)符號(hào)的語(yǔ)義值放在語(yǔ)義棧中 ---當(dāng)產(chǎn)生式進(jìn)行歸約時(shí),需對(duì)產(chǎn)生式右部符號(hào)的語(yǔ)義值進(jìn)行綜合, 其結(jié)果作為左部符號(hào)的語(yǔ)義值保存到語(yǔ)義棧中。 下推棧包
4、含3部分: ---狀態(tài)棧、符號(hào)棧和語(yǔ)義棧 ---注:語(yǔ)義棧與狀態(tài)棧和符號(hào)棧是同步變化的。,第一節(jié) 概述,三、語(yǔ)義子程序 注:1)若把語(yǔ)義子程序改成產(chǎn)生某種中間代碼的動(dòng)作,就能在語(yǔ)法分析制導(dǎo)下,隨著分析的進(jìn)展逐步生成中間代碼。 2)若把語(yǔ)義子程序改成產(chǎn)生某種機(jī)器的匯編語(yǔ)言指令,就能隨著分析的進(jìn)展逐步生成某機(jī)器的匯編語(yǔ)言代碼。,第一節(jié) 概述,例如: 產(chǎn)生式 語(yǔ)義子程序 (0)S E PRINT E VAL (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))
5、 EVAL=E(1)VAL (4)E i EVAL=LEXVAL 注:LEXVAL指的是詞法分析送來(lái)的機(jī)內(nèi)二進(jìn)制整數(shù)。,,,,,,下推棧,第一節(jié) 概述,注:由于語(yǔ)義值是放在語(yǔ)義棧中的,它也可以用棧頂指針TOP指出,語(yǔ)義子程序改寫為: 產(chǎn)生式 語(yǔ)義子程序 (0)S E PRINT VALTOP (1)E E(1) +E(2) VALTOP=VALTOP+VALTOP+2 (2)E E(1) * E(2) VALTOP=VALTOP*VALTOP+2 (3)E (E(1)) VALTOP=TOP+1 (4)E i VALTOP=LEXVAL 注:LEXVAL指的是詞法分析
6、送來(lái)的機(jī)內(nèi)二進(jìn)制整數(shù)。,,,,,,第一節(jié) 概述,例如:分析輸入串(7+9)*5#,并給出它的計(jì)算過(guò)程。分析表如下:,第一節(jié) 概述,四、常見的中間代碼形式 1.四元式形式 (Operator,Operand1, Operand2, Result) 注:1)Operand1, Operand2, Result可能是用戶自定義的變量,也可能是編譯時(shí)引進(jìn)的變量,這里Operator是雙目運(yùn)算符,若只有一個(gè)運(yùn)算量,則是單目運(yùn)算符。 2)四元式中變量采用符號(hào)表入口的地址,而不用變良的地址,因?yàn)檎Z(yǔ)義分析不僅需要變量的地址,還需要從符號(hào)表查到的變量的屬性,類型和地址等。,第一節(jié) 概述,四、常見的中間代碼形式
7、 2.三元式 (Operator,Operand1, Operand2) 注:1)這里三元式本身作為存放結(jié)果的單元。 2)為了在其它三元式中利用當(dāng)前三元式的結(jié)果,需要對(duì)三元式進(jìn)行遍號(hào)。三元式的編號(hào)就作為相應(yīng)三元式的結(jié)果值。,第一節(jié) 概述,四、常見的中間代碼形式 3、后綴表示式(逆波蘭表示式) Operand1 Operand2 Operator 4、樹型表示法,Operator,Operand2,Operand1,,,注:常用中間代碼表示法是四元式,第二節(jié) 簡(jiǎn)單算術(shù)表達(dá)式和賦值語(yǔ)句的翻譯,一、賦值語(yǔ)句的翻譯 ----僅含簡(jiǎn)單變量的表達(dá)式和賦值語(yǔ)句的翻譯 1、賦值語(yǔ)句的文法 A i=E E
8、 E+E|E*E|-E|(E)|i 2、需要的語(yǔ)義過(guò)程 NEWTEMO函數(shù):每次使用送回一個(gè)代表新臨時(shí)變量的序號(hào),可認(rèn)為是送回T1,T2這樣的一些臨時(shí)變量; ENTRY(i)函數(shù):用于查變量i的符號(hào)表入口地址; GEN(OP,ARG1,ARG2,RESULT)過(guò)程:產(chǎn)生一個(gè)四元式,并填入四元式序列表,,,第二節(jié) 簡(jiǎn)單算術(shù)表達(dá)式和賦值語(yǔ)句的翻譯,一、賦值語(yǔ)句的翻譯 3、需要的語(yǔ)義變量 EPLACE:與非終結(jié)符E相聯(lián)系的語(yǔ)義變量 ---值為某變量的符號(hào)表入口地址或臨時(shí)變量序號(hào)。 ---它與文法的非終結(jié)符相聯(lián),分析過(guò)程就建立,不需要就消亡。,產(chǎn)生式 語(yǔ)義子程序 (1)A i=E GEN
9、(=,EPLACE,_,ENTRY(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、符號(hào)
10、棧是為了介紹才列出的,實(shí)際上不存在。 2、由于語(yǔ)義分析是在語(yǔ)法分析的過(guò)程中進(jìn)行的,所以狀態(tài)棧實(shí)際上是需要的,這里沒有寫出來(lái)。 3、這個(gè)分析過(guò)程是針對(duì)整型變量做的。實(shí)際上在一個(gè)表達(dá)式中,可能出現(xiàn)各種不同類型的變量或常量,所以,編譯程序要么拒絕接受某種混合運(yùn)算,要么能產(chǎn)生有關(guān)類型轉(zhuǎn)換的指令。,第二節(jié) 簡(jiǎn)單算術(shù)表達(dá)式和賦值語(yǔ)句的翻譯,類型轉(zhuǎn)換 對(duì)于表達(dá)式文法中的i是實(shí)型又可以是整型。 對(duì)這種混合運(yùn)算,我們要先把整型量轉(zhuǎn)化為實(shí)型量,就需要為每個(gè)非終結(jié)符的語(yǔ)義值添加類型信息,用EMODE表示非終結(jié)符E的類型信息。 1、定義各非終結(jié)符的類型信息 產(chǎn)生式E E(1)op E(2)的語(yǔ)義動(dòng)作中要加入關(guān)于EMO
11、DE的語(yǔ)義規(guī)則的定義; --IF E(1)MODE=int AND E(2)MODE=int --IF EMODE=int ELSE EMODE=r,,第二節(jié) 簡(jiǎn)單算術(shù)表達(dá)式和賦值語(yǔ)句的翻譯,2、對(duì)運(yùn)算量進(jìn)行類型轉(zhuǎn)換 例如:X=Y+I*J,其中X,Y是實(shí)型,I,J是整型。 其四元式為: --(*I,I,J,T1) --(itr,T1,_,T2) --(+r,Y,T2,T3) --(=,T3,_,X),第二節(jié) 簡(jiǎn)單算術(shù)表達(dá)式和賦值語(yǔ)句的翻譯,注:1)對(duì)運(yùn)算符也要指出相應(yīng)的類型(運(yùn)算符上加角標(biāo)),說(shuō)明是定點(diǎn)還是浮點(diǎn)遠(yuǎn)算。 2)由于非終結(jié)符E的語(yǔ)義值有EPLACE和EMODE兩個(gè),這兩者都要保存在語(yǔ)
12、義棧中。 3)在運(yùn)算量的類型較多的情況下,需要仔細(xì)推敲語(yǔ)義規(guī)則,否則語(yǔ)義子程序會(huì)變置累贅不填。,第三節(jié) 布爾表達(dá)式的翻譯,一、布爾表達(dá)式在程序設(shè)計(jì)語(yǔ)言中的作用 --用作控制語(yǔ)句中的條件表達(dá)式 --用于邏輯賦值語(yǔ)句中布爾表達(dá)式演算 二、布爾表達(dá)式的組成 --由布爾算符作用于布爾變量(或常量)或關(guān)系表達(dá)式而形成的。 --布爾算符:,, --關(guān)系表達(dá)式的形式: E(1)rop E(2),其中rop是關(guān)系運(yùn)算符(如,=,), E(1)和E(2)是算術(shù)表達(dá)式。,,,第三節(jié) 布爾表達(dá)式的翻譯,三、布爾表達(dá)式的文法: --G(B):E EE|EE| E|(E)|i|Ea rop Ea --i為布爾變量或常
13、量;Ea為算術(shù)表達(dá)式。 注:1)此文法為二義文法,一般布爾算符的優(yōu)先順序?yàn)椋?,,服從左結(jié)合律;關(guān)系運(yùn)算優(yōu)先級(jí)別高于布爾運(yùn)算。 2)由于布爾表達(dá)式有兩種用途,所以有兩種不同的翻譯方法。,,,,,,第三節(jié) 布爾表達(dá)式的翻譯,四、布爾表達(dá)式在邏輯演算中的翻譯 1、語(yǔ)義子程序 由于布爾表達(dá)式演算與算術(shù)表達(dá)式計(jì)算非常類似,可以仿照算術(shù)表達(dá)式的翻譯方法,為每個(gè)產(chǎn)生式寫出語(yǔ)義子程序。,產(chǎn)生式 語(yǔ)義子程序 (1)E Ea(1)ropEa(2) T=NEWTEMP; GEN(rop,Ea(1)PLACE,Ea(2)PLACE,T); EPLACE=T (2)E Ea(1)bopEa
14、(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(1)) EPLACE=E(1)PLACE (5)E i EPLACE=ENTRY(i),,,,,,,,,,第三節(jié) 布爾表達(dá)式的翻譯,四、布爾表達(dá)式在邏輯演算中的翻譯 2、實(shí)例:對(duì)布爾式X+YZA( BC) 進(jìn)行翻譯: 解:語(yǔ)法制導(dǎo)翻譯是在語(yǔ)法分析下的過(guò)程中進(jìn)行的,若利用G(B)文法的LR分析表對(duì)上句進(jìn)行LR分析,在其過(guò)程
15、中進(jìn)行語(yǔ)義分析;則得到對(duì)上句進(jìn)行LR分析,在其過(guò)程中進(jìn)行語(yǔ)義分析;則得到的四元式序列是: --(+,X,Y,T1);E+E進(jìn)行歸約,識(shí)別了算術(shù)運(yùn)算 --(,T1,Z,T2);EE進(jìn)行歸約,識(shí)別了關(guān)系運(yùn)算 --( ,B,_,T3); E歸約 --(,T3,C,T4);EE進(jìn)行歸約 --(,A,T4,T5); EE進(jìn)行歸約 --(,T2,T5,T6); EE進(jìn)行歸約,,,,,,,第三節(jié) 布爾表達(dá)式的翻譯,注:上面的翻譯質(zhì)量并不高,可以采取某種優(yōu)化措施: 例如: 對(duì)AB.若已知A的值是1.那么 B的值就不需要知道就能得出AB=1; ---可以表示為:IF A THEN TRUE ELSE B 對(duì)AB
16、若已知A的值是0,那么B的值就不需要知道就錯(cuò)得出AB=0; ---可以表示為: IF A THEN FALSE ELSE TRUE,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中布爾式的翻譯 1、控制語(yǔ)句中布爾式并不需要計(jì)算表達(dá)式的值,只用if-then-else來(lái)解釋, , ,以來(lái)控制程序流向。 If E then S1 else S2,,,E的代碼序列,S1的代碼序列,S2的代碼序列,,,,,,,,假,真,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中的布爾式的翻譯 2、控制語(yǔ)句中的布爾式的翻譯的四元式為以下三種: (juz,A1,_,P - if A1 then goto P (jQ,A1,A2,
17、 - if A1QA2 then goto P (j,_,_,P) -Goto P 注:這些四元式都是轉(zhuǎn)移四元式,其中P為出口的四元式序號(hào),與E的真假值相對(duì)應(yīng)的分別為真出口和假出口兩類四元式。,例如:把語(yǔ)句if AB 18、2代碼段 (p+1)S2語(yǔ)句的第一個(gè)四元式 . (q)此語(yǔ)句的后繼語(yǔ)句,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中布爾式的翻譯 4、增加語(yǔ)義值 ETC、EFC的值也可以放在語(yǔ)義棧中,即下推棧又增加了兩欄.,S,SYM,PLACE,TC,FC,分析棧,語(yǔ)義棧,,,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中布爾式的翻譯 5、文法G(B)各產(chǎn)生式的語(yǔ)義子程序 ----文法:E EAE|E0E| E|(E)|i|EaropEa EA E E0 E 語(yǔ)義子程序: --(1)E i ETC=NXQ; EFC=NXQ+1; -- GEN(jnz,ENTRY(i),_,O); -- GEN( 19、j,_,_,O) --注:將布爾型操作數(shù)進(jìn)行歸約,產(chǎn)生兩個(gè)四元式; 無(wú)論真假都不知該轉(zhuǎn)到哪個(gè)四元式上去,故轉(zhuǎn)向0,,,,,,例如:將控制語(yǔ)句中的AB 20、轉(zhuǎn)移到歸約后的下一個(gè)四元式,即判斷右邊式子的值的第一個(gè)四元式。,,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中布爾式的翻譯 5、文法G(B)各產(chǎn)生式的語(yǔ)義子程序 PROCEDURE BACKPATCH(p,t) Q=P; WHILE (Q0) q=四元式Q第四段的內(nèi)容; 把t填入四元式Q的第四段; Q=q; 注:其算法思想是:從鏈頭算起,邊找邊讀,直到鏈尾為止。,例如:將控制語(yǔ)句中的AB 21、G(B)各產(chǎn)生式的語(yǔ)義子程序 (2)E EaropEa -- ETC=NXQ; EFC=NXQ+1; -- GEN(jrop,Ea(1)PLACE,Ea(2)PLACE,0); -- GEN(j,_,_,0),,例如:將控制語(yǔ)句中的AB 22、8) E E0E(2) -- EFC=E(2)FC; -- ETC=MERG(E0TC, E(2)TC 注:由于E的真假?zèng)Q定于E(2)為假時(shí)它們的轉(zhuǎn)移相同;由于E(1)或E(2)為真時(shí)都導(dǎo)致問真,所以它們?yōu)檎娴那闆r要合并起來(lái)。,,例如:將控制語(yǔ)句中的AB 23、HILE 四元式P的第4段內(nèi)容不為0 P=四元式P的第4段內(nèi)容; 把P1填進(jìn)四元式P的第四段; MERG=P2; 注:算法思想:找到P2的鏈尾,然后將P1連接到P2的鏈尾。,第三節(jié) 布爾表達(dá)式的翻譯,(3)E (E(1)) ETC=E(1)TC; EFC=E(1)FC (4)E E(1) ETC=E(1)FC; EFC=E(1)FC (5)EA E(1) -- BACKPATCH(ETC,NXQ); -- EAFC=E(1)FC; (6)E EAE(2) -- ETC=E(1)TC; -- EFC=MERG(EAFC,E(2)FC,,,,,第三節(jié) 布爾表達(dá)式的翻譯,五、控制語(yǔ)句中布 24、爾式的翻譯 例如:將布爾式AB C在語(yǔ)法制導(dǎo)下翻譯成四元式。,,,,,,,,,,,,,,,,,,,,,,,,,,,,,第四節(jié) 控制語(yǔ)句的翻譯,一、控制語(yǔ)句的種類: 無(wú)條件轉(zhuǎn)換語(yǔ)句 條件語(yǔ)句 迭代語(yǔ)句 循環(huán)語(yǔ)句 分支語(yǔ)句,第四節(jié) 控制語(yǔ)句的翻譯,二、標(biāo)號(hào)和轉(zhuǎn)移語(yǔ)句(GOTO) 1、標(biāo)號(hào)和轉(zhuǎn)移語(yǔ)句(GOTO) (1)標(biāo)號(hào)語(yǔ)句 ---GOTO語(yǔ)句實(shí)現(xiàn)無(wú)條件轉(zhuǎn)移,要確定轉(zhuǎn)移的目的語(yǔ)句,需要給語(yǔ)句加標(biāo)號(hào)。 ---帶標(biāo)號(hào)的語(yǔ)句形式:L:S L是標(biāo)號(hào) (2)標(biāo)號(hào)的定義和使用: ---先定義后使用 L:S ..GOTO L ---先使用后定義 GOTO LL:S,第四節(jié) 控制語(yǔ)句的翻譯,2、先定義后使用 (1 25、)形式:L:S --- . --- GOTO L --- . (2)定義和使用表號(hào)的文法 --- S goto L --- Label i: (3)翻譯過(guò)程: ---當(dāng)遇到定義性的標(biāo)號(hào)語(yǔ)句時(shí),將L歸約為L(zhǎng)abel,再將L填入符號(hào)表,如下:,,,S.QUAD:即S對(duì)應(yīng)的入口四元式序號(hào)。 當(dāng)后面遇到GOTO L語(yǔ)句時(shí),便產(chǎn)生四元式: (j,_,_,P), 其中P=S.QUAD,2、先使用后定義 (1)形式:GOTO L ------ ------ GOTO L ------ . ------ GOTO L ------ . ------ L:S (2)翻 26、譯過(guò)程: ----由于這里是先使用,所以當(dāng)遇到標(biāo)號(hào)L時(shí),它還未定義,故而填入符號(hào)表時(shí)情況與上不同,表如下:,(2)翻譯過(guò)程: (a)填符號(hào)表:將定義否欄填“未”,地址檔暫填即將生成的四元式序號(hào)P,CAT欄填“標(biāo)號(hào)”; (b)生成四元式 (P) (j,_,_,0),等待回填;,(c)當(dāng)遇到第2個(gè)使用性標(biāo)號(hào)L時(shí),修改符號(hào)表,僅將L這一行的地址欄內(nèi)容修改為即將生成的四元式序號(hào)q; (b)生成四元式 (q) (j,_,_,P),其中第四段的P取自符號(hào)表的地址欄在修改前的內(nèi)容,即形成一個(gè)需要回填的鏈,不斷重復(fù)(c)(d).,,(p) (j,_,_,0) (q) (j,_,_,p) (r) (j,_,_, 27、q),第四節(jié) 控制語(yǔ)句的翻譯,二、標(biāo)號(hào)和轉(zhuǎn)移語(yǔ)句(GOTO) 2、先使用后定義 (2)翻譯過(guò)程: ---e)當(dāng)定義性語(yǔ)句L:S出現(xiàn)時(shí),用S語(yǔ)句所對(duì)應(yīng)的第一個(gè)四元式序號(hào)回填這個(gè)鏈,即使用 BACKPATCH過(guò)程。 ---注:此鏈表的鏈?zhǔn)自诜?hào)表的相應(yīng)行的地址欄內(nèi)。 (3)形式化的語(yǔ)義子程序: ---產(chǎn)生式 語(yǔ)義子程序 --- S goto L 程序1 ---label i: 程序2,,,----查符號(hào)表: ----若L不在表中,在表中建L這行,CAT欄置標(biāo)號(hào),定義否填“未”,地址為NXQ;GEN(j,_,_,0); ----若L在表中,但未定義,則;P=L 28、地址; L.地址為NXQ;GEN(j,_,_,p); ----若L在表中,已定義,則:P=L.地址; GEN(j,_,_,p); ----,----查符號(hào)表: ----若L不在表中,在表中建L這行,CAT欄置標(biāo)號(hào),定義否填“已”,地址為NXQ; ----若L已在表中,但定義否填“已”或CAT標(biāo)號(hào),則出錯(cuò); ----否則,將定義否改為“已”; ----q=L.地址; ----BACKPATCH(q.NXQ); ----L.地址=NXQ; ----,第四節(jié) 控制語(yǔ)句的翻譯,三、IF語(yǔ)句的翻譯 1、描述IF語(yǔ)句的文法 ----S if E then S(1) ----S if E then 29、S(1) else S(2) 2、IF語(yǔ)句的翻譯 ---(1)完成對(duì)布爾式E的翻譯,獲得一元四元式,并留下兩個(gè)待續(xù)的語(yǔ)義值EEC,EFC; ---(2)掃描完then之后,就得到了E的真出口,用BACKPATCH(EEC,NXQ)過(guò)程或填; ---(3)翻譯S(1),它可能會(huì)是任何一種語(yǔ)句,總可以遞歸地調(diào)用語(yǔ)句翻譯過(guò)程來(lái)完成,得到一組四元式序列;,,,第四節(jié) 控制語(yǔ)句的翻譯,三、IF語(yǔ)句的翻譯 2、IF語(yǔ)句的翻譯 ---(4)若遇到else,表示S(1)已翻譯完,應(yīng)無(wú)條件生成一條GOTO四元式(j,_,_,0)轉(zhuǎn)到S(2)語(yǔ)句后面,以示這個(gè)IF語(yǔ)句已執(zhí)行結(jié)束。但這個(gè)無(wú)條件轉(zhuǎn)移語(yǔ)句究竟轉(zhuǎn)到什么地 30、方去,是不確定的.甚至在翻譯完S(2)語(yǔ)句之后也不一定確定下來(lái)。遇到else還表示已獲得E的假出口。 例如:語(yǔ)句 ---if E1 then if E2 then S1 else S2 else S3 注:由于轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo)只能等到出口明朗了才能回填。此時(shí)應(yīng)把該待填的四元式序號(hào)并鏈后存在與代表整個(gè)語(yǔ)句的非終結(jié)符S相聯(lián)系的語(yǔ)義棧 SCHAIN中。,第四節(jié) 控制語(yǔ)句的翻譯,三、IF語(yǔ)句的翻譯 2、IF語(yǔ)句的翻譯 (4)若不遇到else,那么布爾式的假出口與S(1)的結(jié)束出口都表示IF語(yǔ)句的結(jié)束。 (5)翻譯S(2)語(yǔ)句成四元式序列。它執(zhí)行過(guò)后也表示IF語(yǔ)句應(yīng)該結(jié)束了,它的結(jié)束出口和S(1)是一 31、樣的,可將它們出口并鏈,鏈?zhǔn)字糜赟CHAIN. 姑,條件語(yǔ)句翻譯之后,除了生成相應(yīng)E,S(1),S(2)的四元式之外,還剩下一個(gè)待填語(yǔ)句鏈,鏈?zhǔn)自?SCHAIN中,出口明確后接此回填。,第四節(jié) 控制語(yǔ)句的翻譯,三、IF語(yǔ)句的翻譯 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 CS(1),,,,,,,,第四節(jié) 控制語(yǔ)句的翻譯,三、IF語(yǔ)句的翻譯 4、語(yǔ)義子程序 C if E then BA 32、CKPATCH(EEC,NXQ); CCHAIN=EFC; T CS(1) else q=NXQ;GEN(j,_,_,0); BACKPATCH(CCHAIN,NXQ); TCHAIN=MERG(S(1)CHAIN,q) S TS(2) SCHAIN=MERG(TCHAIN, S(2)CHAIN) S CS(1) SCHAIN=MERG(TCHAIN, S(2)CHAIN),,,,,第四節(jié) 控制語(yǔ)句的翻譯,例如:翻譯無(wú)條件嵌套語(yǔ)句: if a then if b then A:=2 else A:=3 ELSE if c then A:=4 Else A 33、:=5 翻譯成四元式為:,(1)(jnz,a,_,0) (2)(j,_,_,0) (3)(jnz,b,_,0) (4)(j,_,_,0) (5)(:=,2,_,A) (6)(j,_,_,0) (7)(:=,3,_,A) (8)(j,_,_,0),第四節(jié) 控制語(yǔ)句的翻譯,(1)(jnz,a,_,0) (2)(j,_,_,0) (3)(jnz,b,_,0) (4)(j,_,_,0) (5)(:=,2,_,A) (6)(j,_,_,0) (7)(:=,3,_,A) (8)(j,_,_,0),(8)(j,_,_,6) (9)(jnz,c,_,11) (10)(j,_,_,13) (11)(:=,4,_ 34、,A) (12)(j,_,_,8) (13)(:=,5,_.A),a,S4(A:=5),b,S1(A:=2),S2(A:=3),c,S3(A:=4),1,2,3,4,9,10,11,13,7,5,,,,,,,,,,,,,,,,,,,,,,,12,8,6,TRUE,FALSE,if a then if b then A:=2 else A:=3 ELSE if c then A:=4 Else A:=5,第四節(jié) 控制語(yǔ)句的翻譯,四、WHILE語(yǔ)句的翻譯 1、WHILE語(yǔ)句的文法 S while E do S(1) 2、WHILE 語(yǔ)句的翻譯思想 (1)翻譯E代碼段,并留兩個(gè)待填的ETC 35、,ETC鏈 (2)掃描過(guò)do之后,就可以回填ETC (3)翻譯S(1)成代碼段,S(1)翻譯之后,應(yīng)無(wú)條件轉(zhuǎn)到E代碼段的第一條四元式。 :1)因此,開始翻譯while語(yǔ)句時(shí),應(yīng)留下第一條四元式序號(hào),以備S(1)翻譯之后用。 2)E為假時(shí)需回填,此時(shí)ETC作為SCHAIN一部分,以便回填。,,第四節(jié) 控制語(yǔ)句的翻譯,四、WHILE語(yǔ)句的翻譯 3、改寫產(chǎn)生式 S while E do S(1)改寫為: --- W while --- Wd WE do --- S Wd S(1),,,,,第四節(jié) 控制語(yǔ)句的翻譯,4、語(yǔ)義子程序 W while WQUAD=NXQ Wd WE do BACKP 36、ATCH(EFC,NXQ); --- WdCHAIN=EFC; --- WdQUAD=WQUAD; S WdS(1) BACKPATCH(S(1)CHAIN,WdQUAD); --- GEN(j,_,_,WdQUAD); --- SCHAIN= WdCHAIN,,,,第四節(jié) 控制語(yǔ)句的翻譯,例如:翻譯 While(A
37、105)(:=,T1,_,X) (106)(j,_,_,(100)),第四節(jié) 控制語(yǔ)句的翻譯,七、復(fù)合語(yǔ)句的翻譯 1、文法 S begin L end L S L LSS LS L,,,,,第四節(jié) 控制語(yǔ)句的翻譯,七、復(fù)合語(yǔ)句的翻譯 2、語(yǔ)義子程序 (1)L S LCHAIN=SCHAIN; (2)LS L BACKPATCH(LCHAIN,NXQ); (3)L LSS LCHAIN=SCHAIN; (4)S begin L end --- BACKPATCH(LCHAIN,NXQ); --- SCHAIN=0;,,,,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,一 38、、數(shù)組及其下標(biāo)變量地址的計(jì)算 1、數(shù)組分類: ---一維數(shù)組,二維數(shù)組,多維數(shù)組 ---確定數(shù)組,可變數(shù)組: 根據(jù)數(shù)組所需存儲(chǔ)空間是否在編譯時(shí)就已知道 2、多維數(shù)組的存放 ---按行存放 ---按列存放(FORTRAN) ---只要知道數(shù)組的首地址,及每個(gè)數(shù)組元素占多少內(nèi)存單元,就可計(jì)算出任一數(shù)組元素的地址。,例如:2維數(shù)組定義為: ---ArrayL1:u1,L2:u2 ---令di=ui-Li+1,i=1,2, 稱為每一維尺寸 ---D=a+((i1-L1)d2+(i2-L2))*/*m為每個(gè)元素所占尺寸*/ 改寫為D=CONSPART+VARPART ---CONSPART=a-C 39、C=(L1d2+L2)*m ---VARPART=(i1d2+i2)*m,:CONSPART稱作不變部分,它和數(shù)組下標(biāo)無(wú)關(guān),只和各維尺寸和下界有關(guān);只需計(jì)算一次,其中C在編譯時(shí)就可算出。 VARPART稱作可變部分,它和數(shù)組下標(biāo)有關(guān),必須根據(jù)下標(biāo)值,轉(zhuǎn)換成相應(yīng)代碼,待運(yùn)行時(shí)計(jì)算出。,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,一、數(shù)組及其下標(biāo)變量地址的計(jì)算 3、編譯程序?qū)?shù)組說(shuō)明的處理 當(dāng)遇到數(shù)組說(shuō)明時(shí),必須把數(shù)組的有關(guān)信息記錄在一張“內(nèi)情向量”表中,以便以后計(jì)算數(shù)組下標(biāo)變量地址時(shí)引用這些信息。 內(nèi)情向量表的結(jié)構(gòu): 一維數(shù),各維上下界,首地址,類型,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,一、數(shù)組 40、及其下標(biāo)變量地址的計(jì)算 3、編譯程序?qū)?shù)組說(shuō)明的處理 1)對(duì)于確定的數(shù)組來(lái)說(shuō):內(nèi)情向量可登記在編譯時(shí)的符號(hào)表中; 2)對(duì)于可變數(shù)組來(lái)說(shuō): (1)內(nèi)情向量在編譯時(shí)無(wú)法知道,只有在運(yùn)行時(shí)才能算出來(lái); 因此,編譯程序必須為可變數(shù)組設(shè)置一個(gè)存儲(chǔ)空間,以便運(yùn)行對(duì)建立相應(yīng)的內(nèi)情向量表。 (2)這樣,就必須在編譯時(shí)為運(yùn)行程序準(zhǔn)備好調(diào)用的運(yùn)行子程序,我們不作討論。,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,二、確定數(shù)組的數(shù)組元素引用的中間代碼形式 1、訪問數(shù)組元素可設(shè)想為: 把它的VARPART計(jì)算在某一變址單元T中,用CONSPART作為“基礎(chǔ)”。然后以變址方式訪問存儲(chǔ)單元---CONPARTT,靜態(tài)數(shù)組CO 41、NSPART=a-C,C可以從內(nèi)情向量表中查到,而a在運(yùn)行時(shí)一定可確定下來(lái),所以可以生成a-C代碼,待運(yùn)行時(shí)再確定。假定T1是用于存放CONSPART的臨時(shí)單元,T1=a-C那么用T1T表示數(shù)組元素的地址,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 2、訪問數(shù)組元素 引用數(shù)組元素: ----(= ,T1,T,_,X) :這是一個(gè)變址取數(shù)組四元式。 含義相當(dāng)于 X=T1T. 對(duì)數(shù)組元素賦值: ----( =,X,_,T1T) :這是一個(gè)變址存數(shù)四元式。含義相當(dāng)于:T1J=X,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 1 42、、文法 ----A V:=E ----V iElist|i ----Elist Elist,E|E ----E E op E|(E)|V/*op表示各種算術(shù)運(yùn)算*/ :V可以是簡(jiǎn)單變量也可以是下標(biāo)變量. 這個(gè)遞歸定義可形成數(shù)組嵌套數(shù)組結(jié)構(gòu).,,,,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 2、文法改寫 ---A V:=E ---V Elist|I ---Elist Elist(1),E|iE ---E EopE|(E)|V 注:把數(shù)組名i和最左下標(biāo)表達(dá)式寫在一起就表示為數(shù)組i開始計(jì)算第一個(gè)下標(biāo),同時(shí)使我們?cè)谡麄€(gè)下標(biāo)串Elist的翻譯過(guò)程中隨 43、時(shí)都能知道數(shù)組i的符號(hào)表入口地址及表中相應(yīng)信息。,,,,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 3、相關(guān)語(yǔ)義變量和函數(shù)過(guò)程 語(yǔ)義變量: ----ARRAY:數(shù)組名在符號(hào)表的入口地址 ----DIM:數(shù)組下標(biāo)維數(shù)計(jì)數(shù)器 ----PLACE:語(yǔ)義變量,在符號(hào)表入口地址或臨時(shí)變量的序號(hào) ----OFFSET: 簡(jiǎn)單變量:OFFSET=null 下標(biāo)變量:OFFSET保存已計(jì)算出的VARPART,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 3、相關(guān)語(yǔ)義變量和函數(shù)過(guò)程 函數(shù)過(guò)程: ---LIMITARRAY,K:通過(guò)符號(hào)表 44、查內(nèi)情向量表,返回第k維的尺寸dk ---HEADARRAY:取得數(shù)組首地址a,或查內(nèi)情向量表,或等運(yùn)行時(shí)分配得到 ---CONSARRAY:查內(nèi)情向量表,得C值 ---TYPEARRAY:查內(nèi)情向量表TYPE項(xiàng),返回一個(gè)數(shù)組元素,占有的字單元數(shù)m值。,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 4、語(yǔ)義子程序 ---(1)A V:=E ---IF(VOFFSET=null() GEN(=,EPLACe,_,VPLACE); ---ELSE --- GEN( =,EPLACE,_,V PLACEVOFFSET),第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻 45、譯,三、按行存放的賦值語(yǔ)句中的數(shù)組元素的翻譯 4、語(yǔ)義子程序 (2)E E(1)op E(2) T=NEWTEMP; GEN(op,E(1)PLACE,E(2)PLACE,T); EPLACE=T (3)E (E(1)) EPLACE=E(1)PLACE (4)E V IF(VOFFSET=null) --- EPLACE=VPLACE; --- ELSE --- T=NEWTEMP; --- GEN(= ,EPLACEVOFFSET,_,T); --- EPLACE=T;,,,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,(5 46、)V Elist IF(TYPEARRAY1) --- T=NEWTEMP; --- GEN(*,EListPLACE,TYPEARRAY,T); --- ElistPLACE=T; --- VOFFSET=ElistPLACE; --- T=NEWTEMP; --- GEN(_,HEADARRAY,CONSARRAY,T); --- VPLACE=T (6)V i VPLACE=ENTRYi; --- VOFFSET=null,,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,4、語(yǔ)義子程序 (7)Elist Elist(1),E T=NEW 47、TEMP; ---- K=Elist(1)DIMT1; ---- dk=LIMIT(Elist(1)ARRAY,k); ---- GEN(*,Elist(1)PLACE,dk,T); ---- T1=NEWTEMP; ---- GEN(+,T,E PLACE,T1); ---- ElistARRAY=Elist(1)ARRAY; ---- ElistPLACE=T1; ---- ElistDIM=K;,,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,4、語(yǔ)義子程序 (8)Elist iE ----- ElistPLACE=EPLA 48、CE; ----- ElistDIM=1; ----- ElistARRAY=ENTRY(i),,第五節(jié) 數(shù)組元素及其在賦值語(yǔ)句中的翻譯,例如:數(shù)組說(shuō)明為:ARRAY1:10,1:20; 且從內(nèi)情向量表查得數(shù)組首地址為a, C=21,d2=20,m=1為X:=AI,J生成四元式序列: 解:四元式序列為: ----(1)(*,I,20,T1) ----(2)(+,T1,J,T2) ----(3)(-,a,21,T3) ----(4)(= ,T3T2,_,T4) ----(5)(:=,T4,_,X),第六節(jié) 過(guò)程調(diào)用語(yǔ)句,一、過(guò)程調(diào)用 1、過(guò)程 ---定義和調(diào)用過(guò)程是程序語(yǔ)言的主要特征之一,過(guò) 49、程是模塊化程序設(shè)計(jì)的主要手段,同時(shí)也是節(jié)省程序代碼和擴(kuò)充語(yǔ)言能力的主要途徑。 2、過(guò)程調(diào)用 ---實(shí)質(zhì)是把程序控制轉(zhuǎn)到子程序. 3、過(guò)程調(diào)用中遇到的問題: ---子程序完成后如何回到主調(diào)程序; ---子程序回到主調(diào)程序時(shí),運(yùn)行環(huán)境的恢復(fù); ---如何進(jìn)行參數(shù)傳遞;,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,二、參數(shù)傳遞 1、參數(shù) ---實(shí)在參數(shù) ---形式參數(shù) 2、傳遞方式 1)傳地址(call by reference);把實(shí)在參數(shù)的地址傳遞給相應(yīng)的形式參數(shù)。 2)傳值(call by value):把實(shí)在參數(shù)的值計(jì)算出來(lái)傳遞給相應(yīng)的形式參數(shù)。 3)傳名(call by name):ALGOL 60所定義的一種 50、特殊的形實(shí)參結(jié)合方式。,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,二、參數(shù)傳遞 3、傳地址 1)基本方式 A)若實(shí)參是一個(gè)變量(包括下標(biāo)變量),則直接傳遞它的地址; B)若實(shí)參是一個(gè)常數(shù)或其他表達(dá)式,就把值計(jì)算出來(lái)并存放在某臨時(shí)單元,然后傳遞這個(gè)臨時(shí)單元的地址。,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,二、參數(shù)傳遞 3、傳地址 2)傳址過(guò)程 A)當(dāng)程序控制轉(zhuǎn)入被調(diào)用過(guò)程之后,被調(diào)用段首先把實(shí)地址從連接數(shù)據(jù)區(qū)中讀入形參單元中。 ---注:若已直接傳至形參單元,不做此步。 B)在過(guò)程體內(nèi),對(duì)形參的任何引用或賦值都被看作對(duì)新參單元的間接訪問,這間接賦值將直接修改實(shí)參單元的內(nèi)容。,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,二、參數(shù)傳遞 4 、傳值 調(diào)用時(shí)把實(shí) 51、在參數(shù)的值計(jì)算出來(lái),把值直接傳遞給形式單元中,在過(guò)程體內(nèi)應(yīng)用這些單元不會(huì)修改實(shí)質(zhì)單元的值。 5、傳名 過(guò)程調(diào)用相當(dāng)于把調(diào)用段的過(guò)程代替調(diào)用語(yǔ)句,并且過(guò)程體內(nèi)形參名皆用相應(yīng)的實(shí)參名代替。,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,三、過(guò)程調(diào)用語(yǔ)句的翻譯(傳址) 1、文法 ---S call i(Arglist) ---Arglist Arglist,E ---Arglist E 2、相關(guān)四元式 1)(par,_,_,T) ---含義是:將參數(shù)T傳遞到一個(gè)公共的區(qū)域或直接傳遞到過(guò)程的形參單元 2)(jsr,_,n,S) ---含義是:轉(zhuǎn)移指令,轉(zhuǎn)移到S過(guò)程的四元式入口序號(hào)。,,,,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,三、過(guò)程 52、調(diào)用語(yǔ)句的翻譯(傳址) (1)S call i(Arglist) ---- n=0; ---- for(隊(duì)列ArglistQUEUE中的每個(gè)P) ---- GEN(par,_,_,P); ---- n=n+1; ---- GEN(jsr,_,n,ENTRY(i)) (2)Arglist Arglist(1) E ---- 把EPLACE添加入Arglist(1) QUEUE 末端; ---- ArglistQUEUE=Arglist(1)QUEUE,,,第六節(jié) 過(guò)程調(diào)用語(yǔ)句,例如:過(guò)程調(diào)用:CALL S(A+B,Z) 譯為: ----- K(+,A,B,T) ----- 53、K+1(par,_,_,T) ----- K+2(par,_,_,Z) ----- K+3(jsr,_,2,S),第九節(jié) 自上而下分析的制導(dǎo)的翻譯,一、自上而下分析的制導(dǎo)的翻譯 通過(guò)推導(dǎo)自左而右地產(chǎn)生句子的各終結(jié)符號(hào),再按產(chǎn)生式推導(dǎo)的過(guò)程添加語(yǔ)義子程序,無(wú)需得到侯選式匹配完后,即不必改寫文法。 注:1)在按產(chǎn)生式推導(dǎo)的中間任何一步都可以添加語(yǔ)義子程序,所以不必改寫文法。 2)實(shí)際上,程序設(shè)計(jì)語(yǔ)言絕大部分均可使用自上而下分析并生成相應(yīng)中間代碼。 二、自上而下分析制導(dǎo)翻譯種類 1、遞歸下降分析制導(dǎo)翻譯 2、LL(1)分析制導(dǎo)翻譯,第十節(jié) 中間代碼的其它形式,一、后綴表示法(逆波蘭表示法) 1、 54、后綴表示法的文法 ---- ::=| | ---- ::= ---- ::=+|-|*|/ ----注:這種表示法不帶括號(hào),根據(jù)運(yùn)算量和運(yùn)算符出現(xiàn)的先后位置,以及每個(gè)運(yùn)算符的目數(shù),就完全決定了一個(gè)表達(dá)式的計(jì)算程序。,第十節(jié) 中間代碼的其它形式,后綴表示法的特點(diǎn): ---(1)運(yùn)算量的排列順序與中綴表示法相同; ---(2)遠(yuǎn)算量是按運(yùn)算的順序排列的; ---(3)運(yùn)算符緊跟在被云酸的對(duì)象之后出現(xiàn)。 ---注:它顯然不符合人的習(xí)灌,但隊(duì)計(jì)算機(jī)來(lái)說(shuō),很容易使用一個(gè)棧來(lái)計(jì)算它的值,或轉(zhuǎn)換成另一種代碼。,第十節(jié) 中間代碼的其它形式,二、語(yǔ)法制導(dǎo)產(chǎn)生后綴式 首先,除了堆棧外,為分析過(guò)程 55、設(shè)置一個(gè)一維數(shù)組POST來(lái)存放后綴式;初始時(shí),其下標(biāo)K為1。 然后,利用算符優(yōu)先分析法,第十節(jié) 中間代碼的其它形式,二、語(yǔ)法制導(dǎo)產(chǎn)生后綴式 1、利用算符優(yōu)先分析法進(jìn)行語(yǔ)法分析 語(yǔ)義子程序 產(chǎn)生式 語(yǔ)義子程序 (1)E E(1)opE(2) POSTK=op;k=k+1; (2)E (E(1)) (3)E i POSTK=ENTRY(i);k=k+1; 例如:假定算符優(yōu)先分析表已選好,對(duì)表達(dá)式A*(B+C)# 翻譯成后綴式,,,,第十節(jié) 中間代碼的其它形式,二、語(yǔ)法制導(dǎo)產(chǎn)生后綴式 2、后綴表示法的計(jì)值和產(chǎn)生中間代碼 1)計(jì)值過(guò)程:至左至右掃描后綴式,沒碰到運(yùn)算量就 56、將其入棧,每遇到K目運(yùn)算符就將它作用于棧頂?shù)膋項(xiàng),并將運(yùn)算結(jié)果來(lái)代替這k項(xiàng)。 --例如:ab+c* 2)產(chǎn)生四元式過(guò)程:自左至右掃描后綴式,每碰到運(yùn)算量就將其入棧,每遇到k目運(yùn)算符就將它作用于棧頂?shù)腒項(xiàng),并生成相應(yīng)的中間代碼,以結(jié)果的臨時(shí)變量序號(hào)代替該棧頂?shù)膋項(xiàng)。,第十節(jié) 中間代碼的其它形式,二、語(yǔ)法制導(dǎo)產(chǎn)生后綴式 3、后綴式的推廣 方法:遵守運(yùn)算符緊跟在被作用的運(yùn)算量之后。 例如:(1) 賦值語(yǔ)句A:=E,后綴式為:AE:= (2)轉(zhuǎn)向語(yǔ)句GOTO L,后綴式為:Ljmp ---其中L是指示器,用POST中的下標(biāo)值表示。 (3)條件語(yǔ)句 if xy then m:=x else m:=y;其后綴值為:,,,,,,,Begin k:=100; L:if ki+j;goto L end else k:=i2-j2 i:=0; End.,注:翻譯成后綴式時(shí)也存在拉鏈回填的問題,小結(jié),1、算術(shù)表達(dá)式及賦值語(yǔ)句翻譯 2、控制語(yǔ)句中布爾表達(dá)式翻譯 ---留有真、假出口 ---回填過(guò)程與并鏈函數(shù) 3、標(biāo)號(hào)和轉(zhuǎn)移語(yǔ)句翻譯 4、IF語(yǔ)句的翻譯 5、WHILE語(yǔ)句的翻譯 6、語(yǔ)法制導(dǎo)生成后綴式(逆波蘭表達(dá)式),
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第七章-透射電子顯微鏡
- 群落的結(jié)構(gòu)(課件)
- 焊接基礎(chǔ)知識(shí)
- 水文地質(zhì)學(xué)課件
- 某公司員工工傷安全管理規(guī)定
- 消防培訓(xùn)課件:安全檢修(要點(diǎn))
- 某公司安全生產(chǎn)考核與獎(jiǎng)懲辦法范文
- 安全作業(yè)活動(dòng)安全排查表
- 某公司危險(xiǎn)源安全辨識(shí)、分類和風(fēng)險(xiǎn)評(píng)價(jià)、分級(jí)辦法
- 某公司消防安全常識(shí)培訓(xùn)資料
- 安全培訓(xùn)資料:危險(xiǎn)化學(xué)品的類別
- 中小學(xué)寒假學(xué)習(xí)計(jì)劃快樂度寒假充實(shí)促成長(zhǎng)
- 紅色插畫風(fēng)輸血相關(guān)知識(shí)培訓(xùn)臨床輸血流程常見輸血不良反應(yīng)
- 14.應(yīng)急救援隊(duì)伍訓(xùn)練記錄
- 某公司各部門及人員安全生產(chǎn)責(zé)任制