版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
小型編譯程序介紹第一頁,共五十八頁,2022年,8月28日9.1小型編譯程序結(jié)構(gòu) 編譯程序的工作貫穿于從輸入源程序開始到輸出目標(biāo)程序?yàn)橹沟恼麄€過程,是非常復(fù)雜的。一般來說,整個過程可以劃分成五個階段:詞法分析、語法分析、中間代碼生成、優(yōu)化和目標(biāo)代碼生成。 第一階段為詞法分析。詞法分析的任務(wù)是輸入源程序,對構(gòu)成源程序的字符串進(jìn)行掃描和分解,識別出一個個單詞符號,如保留字、標(biāo)識符、常數(shù)、算符和界符等。第二頁,共五十八頁,2022年,8月28日 第二階段為語法分析。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語言的語法規(guī)則(文法規(guī)則)把單詞符號串分解成各類語法單位(語法范疇),如“短語”、“子句”、“句子”、“程序段”和“程序”。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的“程序”。 第三階段為中間代碼產(chǎn)生。按語言的語義將語法分析出來的語法單位翻譯成中間代碼。一般而言,中間代碼是一種獨(dú)立于具體硬件的記號系統(tǒng),但它與計(jì)算機(jī)的指令形式有某種程度的接近,或者能夠比較容易地把它變換成計(jì)算機(jī)的機(jī)器指令。常用的中間代碼有四元式、三元式、間接三元式和逆波蘭記號等。第三頁,共五十八頁,2022年,8月28日圖9-1編譯程序結(jié)構(gòu)示意第四頁,共五十八頁,2022年,8月28日 第四階段為優(yōu)化。優(yōu)化的任務(wù)在于對前階段產(chǎn)生的中間代碼進(jìn)行加工變換,以期在最后階段能產(chǎn)生出更為高效(節(jié)省時間和空間)的目標(biāo)代碼。 第五階段為目標(biāo)代碼生成。這一階段的任務(wù)是把中間代碼(或經(jīng)優(yōu)化處理之后)變換成特定機(jī)器上的絕對指令代碼或可重新定位的指令代碼或匯編指令代碼。這一階段實(shí)現(xiàn)了最后的翻譯,它的工作有賴于硬件系統(tǒng)結(jié)構(gòu)和機(jī)器指令含義。第五頁,共五十八頁,2022年,8月28日 上述編譯過程的五個階段是編譯程序工作時的動態(tài)特征,編譯程序的結(jié)構(gòu)可以按照這五個階段的任務(wù)分模塊進(jìn)行設(shè)計(jì)。編譯程序的結(jié)構(gòu)示意如圖9-1所示。 我們設(shè)計(jì)的小型編譯程序包含除優(yōu)化以外的其余各階段。第六頁,共五十八頁,2022年,8月28日9.2小型編譯程序關(guān)于高級語言的規(guī)定 高級語言程序具有四種基本結(jié)構(gòu):順序結(jié)構(gòu)﹑選擇結(jié)構(gòu)﹑循環(huán)結(jié)構(gòu)和過程。為了便于掌握編譯的核心內(nèi)容,突出重點(diǎn),簡化編譯程序的結(jié)構(gòu),同時又涵蓋高級語言程序的基本結(jié)構(gòu),我們選取賦值語句﹑if語句和while語句作為前三種結(jié)構(gòu)的代表,略去了過程結(jié)構(gòu)。實(shí)際上,上述三種語句已經(jīng)基本滿足了高級語言的程序設(shè)計(jì)。因此,我們僅考慮由下面產(chǎn)生式所定義的程序語句:
第七頁,共五十八頁,2022年,8月28日
S→ifBthenSelseS︱whileBdoS︱beginLend︱A L→S;L︱S A→i:=E B→B∧B︱B∨B︱?
B︱(B)︱iropi︱i E→E+E︱E*E︱(E)︱i第八頁,共五十八頁,2022年,8月28日 其中,各非終結(jié)符的含義如下:
S——語句;
L——語句串;
A——賦值句;
B——布爾表達(dá)式;
E——算術(shù)表達(dá)式。第九頁,共五十八頁,2022年,8月28日 各終結(jié)符的含義如下:
i?——整型變量或常數(shù),布爾變量或常數(shù);
rop?——六種關(guān)系運(yùn)算符的代表;
;?——起語句分隔符作用;
:=?——賦值符號;
?
——邏輯非運(yùn)算符“not”;∧?——邏輯與運(yùn)算符“and”;第十頁,共五十八頁,2022年,8月28日 ∨?——邏輯或運(yùn)算符“or”;
+?——算術(shù)加運(yùn)算符; *?——算術(shù)乘運(yùn)算符;
(?——左括號;
)?——右括號。 注意,六種關(guān)系運(yùn)算符分別為
<:小于<=:小于等于<>:不等于
>:大于>=:大于等于=:等于第十一頁,共五十八頁,2022年,8月28日 關(guān)于表達(dá)式的運(yùn)算,我們規(guī)定由高到低優(yōu)先順序?yàn)樗阈g(shù)運(yùn)算、關(guān)系運(yùn)算、布爾運(yùn)算;并且服叢左結(jié)合規(guī)則。算術(shù)運(yùn)算符優(yōu)先級的順序依次為“()”﹑“*”﹑“+”;布爾運(yùn)算符優(yōu)先級的順序依次為“?
”﹑“∧”﹑“∨”;六個關(guān)系運(yùn)算符優(yōu)先級相同。 我們規(guī)定的程序是由一條語句或由begin和end嵌套起來的復(fù)合語句組成的,并且規(guī)定在語句末要加上“#~”表示程序結(jié)束。下面給出的是符合規(guī)定的程序示例:
begin A:=A+B*C; C:=A+2;第十二頁,共五十八頁,2022年,8月28日
whileA<CandB<DdowhileA>BdoifM=NthenC:=DelsewhileA<=DdoA:=D end#~第十三頁,共五十八頁,2022年,8月28日9.3小型編譯程序關(guān)于單詞的內(nèi)部定義
由于我們規(guī)定的程序語句中涉及單詞較少,故在詞法分析階段忽略了單詞輸入錯誤的檢查,而將編譯程序的重點(diǎn)放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號。我們規(guī)定輸出的單詞符號格式為如下的二元式:
(單詞種別,單詞自身的值)
我們對常量,變量,臨時變量,保留關(guān)鍵字(if、while、begin、end、else、then、do等),關(guān)系運(yùn)算符,邏輯運(yùn)算符,分號,括號等,規(guī)定其內(nèi)部定義如表9-1所示。
第十四頁,共五十八頁,2022年,8月28日表9-1關(guān)于單詞的內(nèi)部定義
第十五頁,共五十八頁,2022年,8月28日9.4小型編譯程序的LR分析表
1.算術(shù)表達(dá)式的LR分析表 算術(shù)表達(dá)式文法G[E]如下:
E->E+E︱E*E︱(E)︱I
將文法G[E]拓廣為文法G′[E]:(0)S′→E(1)E→E+E(2)E→E*E(3)E→(E)(4)E→i
由此得到算術(shù)表達(dá)式的SLR(1)分析表如表9-2所示。第十六頁,共五十八頁,2022年,8月28日表9-2算術(shù)表達(dá)式的SLR(1)分析表
第十七頁,共五十八頁,2022年,8月28日
2.
布爾表達(dá)式的LR分析表 布爾表達(dá)式的文法如下:
B->B∧B︱B∨B︱?
B︱iropi︱I
為了便于語法分析時的加工處理,我們將上述文法改寫為文法G[S]:
B→BAB︱BOB︱?
B︱(B)︱iropi︱iBA→B∧BO→B∨第十八頁,共五十八頁,2022年,8月28日 將文法G[S]拓廣為文法G[S′]:(0)S′→B ???(1)B→I ??(2)B→iropi?? ?(3)B→(B)??? (4)B→NOTB??? (5)A→BAND? ??(6)B→AB?? ?(7)O→BOR?? ?(8)B→OB
由此得到布爾表達(dá)式的SLR(1)分析表如表9-3所示。
第十九頁,共五十八頁,2022年,8月28日表9-3布爾表達(dá)式的SLR分析表
第二十頁,共五十八頁,2022年,8月28日
3.程序語句的LR分析表 程序語句的文法G[S]如下:
S→ifethenSelseS︱whileedoS︱beginLend︱aL→S;L︱S
由于在編譯程序設(shè)計(jì)與實(shí)現(xiàn)中,我們是將賦值語句與算術(shù)表達(dá)式歸為一類處理的,故在此將賦值語句僅看作為程序語句文法中的一個終結(jié)符a,將布爾表達(dá)式B也看作為終結(jié)符e。將文法G[S]拓廣為文法G[S′]:(0)S′→S第二十一頁,共五十八頁,2022年,8月28日
(1)S→ifethenSelseS(2)S→whileedoS(3)S→beginLend(4)S→a(5)L→S(6)L→S;L
由此得到程序語句的SLR(1)分析表如表9-4所示。第二十二頁,共五十八頁,2022年,8月28日表9-4程序語句的SLR分析表
第二十三頁,共五十八頁,2022年,8月28日9.5小型編譯程序執(zhí)行過程 小型編譯程序執(zhí)行分兩個階段:第一個階段,將高級語言源程序翻譯成四元式程序;第二個階段,將四元式程序翻譯成匯編語言目標(biāo)程序。執(zhí)行過程示意如圖9-2所示。
第二十四頁,共五十八頁,2022年,8月28日圖9-2執(zhí)行過程示意
第二十五頁,共五十八頁,2022年,8月28日 下例為一個名為PAS.DAT的高級語言源程序經(jīng)過PAS的編譯,產(chǎn)生名為PAS.MED的四元式(中間代碼)程序;PAS.MED經(jīng)過COMPILER編譯生成8086/8088匯編語言目標(biāo)程序PAS.ASM。
/*******************************************/ /*pas.dat*/ /*高級語言源程序?*/ /******************************************/第二十六頁,共五十八頁,2022年,8月28日
while(a>b)do begin ifm>=nthena:=a+1 else whilek=hdox:=x+2; m:=n+x*(m+y) end # ~第二十七頁,共五十八頁,2022年,8月28日
/*******************************************/ /*pas.med*/ /*高級語言生成的四元式文件?*/ /******************************************/
100 (j> ,a ,b ,102 ) 101 (j , , ,117 ) 102 (j>= ,m ,n ,104 ) 103 (j , , ,107 ) 104 (+ ,a ,1 ,T1 )第二十八頁,共五十八頁,2022年,8月28日
105 (:= ,T1 , ,a )
106 (j , , ,112 )
107 (j= ,k ,h ,109 )
108 (j , , ,112 )
109 (+ ,x ,2 ,T2 )
110 (:= ,T2 , ,x ) 111 (j , , ,107 )第二十九頁,共五十八頁,2022年,8月28日
112 (+ ,m ,y ,T3 ) 113 (* ,x ,T3 ,T4 ) 114 (+ ,n ,T4 ,T5 ) 115 (:= ,T5 , ,m ) 116 (j , , ,100 )
/*******************************************/ /*pas.asm*/第三十頁,共五十八頁,2022年,8月28日
/*由四元式文件生成的匯編文件*/ /******************************************/
datasegment ;定義數(shù)據(jù)段
h DW k DW m DW n DW x DW y DW a DW b DW第三十一頁,共五十八頁,2022年,8月28日
dataends ;數(shù)據(jù)段定義結(jié)束
;************************************** codesegment ;定義代碼段
mainprocfar ;程序的執(zhí)行部分
assumecs:code,ds:data start: ;為返回操作系統(tǒng)入棧
pushds subbx,bx pushbx第三十二頁,共五十八頁,2022年,8月28日
;設(shè)置DS段為當(dāng)前數(shù)據(jù)段
movbx,data movds,bx 100: movAX,a ;把條件跳轉(zhuǎn)指令的第一操作數(shù)讀入寄存器
cmpAX,b ;把條件跳轉(zhuǎn)指令的第一操作數(shù)和第二操作數(shù)相減
jg102 ;大于則跳轉(zhuǎn)
101: jmp117 ;產(chǎn)生直接跳轉(zhuǎn)指令第三十三頁,共五十八頁,2022年,8月28日
102: movAX,m ;把條件跳轉(zhuǎn)指令的第一操作數(shù)讀入寄存器
cmpAX,n ;把條件跳轉(zhuǎn)指令的第一操作數(shù)和第二操作數(shù)相減
jge104 ;大于或等于則跳轉(zhuǎn)
103: jmp107;產(chǎn)生直接跳轉(zhuǎn)指令
104:
movAX,a ;把在存儲器中的被加數(shù)賦給結(jié)果寄存器
addAX,1D;把被加數(shù)和加數(shù)立即數(shù)相加第三十四頁,共五十八頁,2022年,8月28日
105: movBX,AX ;執(zhí)行賦值語句,寄存器中的值賦給結(jié)果變量
mova,BX ;在跳出基本塊之前保存寄存器中已改變的變量
106: jmp112 ;產(chǎn)生直接跳轉(zhuǎn)指令
107: movAX,k ;把條件跳轉(zhuǎn)指令的第一操作數(shù)讀入寄存器
cmpAX,h ;把條件跳轉(zhuǎn)指令的第一操作數(shù)和第二操作數(shù)相減
je109 ;相等則跳轉(zhuǎn)第三十五頁,共五十八頁,2022年,8月28日
108: jmp112 ;產(chǎn)生直接跳轉(zhuǎn)指令
109: movAX,x ;把在存儲器中的被加數(shù)賦給結(jié)果寄存器
addAX,2D ;把被加數(shù)和加數(shù)立即數(shù)相加
110: movBX,AX ;執(zhí)行賦值語句,寄存器中的值賦給結(jié)果變量
movx,BX ;在跳出基本塊之前保存寄存器中已改變的變量第三十六頁,共五十八頁,2022年,8月28日
111:jmp107 ;產(chǎn)生直接跳轉(zhuǎn)指令
112:movAX,m ;把在存儲器中的被加數(shù)賦給結(jié)果寄存器
addAX,y ;把被加數(shù)和在存儲器中的加數(shù)相加
113:mulx ;把被乘數(shù)和在存儲器中的乘數(shù)相乘第三十七頁,共五十八頁,2022年,8月28日
114: movBX,n ;把在存儲器中的被加數(shù)賦給結(jié)果寄存器
addBX,AX ;把被加數(shù)和在寄存器中的加數(shù)相加
115: movCX,BX ;執(zhí)行賦值語句,寄存器中的值賦給結(jié)果變量
movm,CX ;在跳出基本塊之前保存寄存器中已改變的變量
116:jmp100 ;產(chǎn)生直接跳轉(zhuǎn)指令第三十八頁,共五十八頁,2022年,8月28日
117: ret mainendp codeends ;代碼段定義結(jié)束
endstart第三十九頁,共五十八頁,2022年,8月28日9.6小型編譯程序運(yùn)行實(shí)例分析 我們以高級語言源程序到四元式的翻譯為例對其進(jìn)行分析。待編譯的PAS.DAT源程序如下:
while(a>b)do begin ifm>=nthena:=a+1 else whilek=hdox:=x+2; m:=n+x*(m+y) end#~第四十頁,共五十八頁,2022年,8月28日 經(jīng)編譯程序運(yùn)行后得到的輸出結(jié)果如下: *******詞法分析結(jié)果*******/*注釋:查單詞內(nèi)部定義和下面的變量名表*/ 3 0/*(sy_while,0)*/ 48 0/*(″(″,0)*/ 56 0/*(變量,a)*/ 42 3/*(rop,″>″)*/ 561/*(變量,b)*/ 490/*(″)″,0)*/第四十一頁,共五十八頁,2022年,8月28日
5 0/*(sy_do,0)*/4 0/*(sy_begin,0)*/0 0/*(sy_if,0)*/56 2/*(變量,m)*/42 2/*(rop,″>=″)*/56 3/*(變量,n)*/1 0/*(sy_then,0)*/56 0/*(變量,a)*/第四十二頁,共五十八頁,2022年,8月28日
38 0/*(″:=″,0)*/56 0/*(變量,a)*/34 0/*(″+″,0)*/56 1/*(整常量,1)*/2 0/*(sy_else,0)*/3 0/*(sy_while,0)*/56 4/*(變量,k)*/第四十三頁,共五十八頁,2022年,8月28日
pressanykeytocontinue42 5/*(rop,″=″)*/56 5/*(變量,n)*/5 0/*(sy_do,0)*/56 6/*(變量,x)*/38 0/*(″:=″,0)*/56 6/*(變量,x)*/第四十四頁,共五十八頁,2022年,8月28日
34 0/*(″+″,0)*/57 2/*(整常量,2)*/8 0/*(″;″,0)*/56 2/*(變量,m)*/38 0/*(″:=″,0)*/56 3/*(變量,n)*/34 0/*(″+″,0)*/第四十五頁,共五十八頁,2022年,8月28日
56 6/*(變量,x)*/36 0/*(″*″,0)*/48 0/*(″c″,c)*/56 2/*(變量,m)*/34 0/*(″+″,0)*/56 7/*(變量,y)*/49 0/*(″)″,0)*/6 0/*(sy_end,0)*/10 0/*(″#″,0)*/第四十六頁,共五十八頁,2022年,8月28日
程序總共9行,產(chǎn)生了43個二元式!*****************變量名表*****************
0 a1
b2
m3
n4
k5
h6
x7
y第四十七頁,共五十八頁,2022年,8月28日 *********狀態(tài)棧分析過程及歸約順序***************
stack[0]=0 n=3 lr=3 stack[1]=3 n=9 lr=7 stack[2]=7 n=5 lr=11 stack[3]=11 n=4 lr=4 stack[4]=4 n=0 lr=2 stack[5]=2 n=9 lr=6 stack[6]=6 n=1 lr=10 stack[7]=10 n=7 lr=5第四十八頁,共五十八頁,2022年,8月28日
stack[8]=5 n=2 lr=104 s->a歸約
stack[7]=10 n=11 lr=14 stack[8]=14 n=2 lr=17 stack[9]=17 n=3 lr=3 stack[10]=3 n=9 lr=7 stack[11]=7 n=5 lr=11 stack[12]=11 n=7 lr=5 stack[13]=5 n=8 lr=104第四十九頁,共五十八頁,2022年,8月28日
s->a歸約
stack[12]=11 n=11 lr=15 stack[13]=15 n=8 lr=102 s->whileedos歸約
stack[9]=17 n=11 lr=18 stack[10]=18 n=8 lr=101第五十頁,共五十八頁,2022年,8月28日
s->ifethenselses歸約
stack[4]=4 n=11 lr=9 stack[5]=9 n=8 lr=13 stack[6]=13 n=7 lr=5 stack[7]=5 n=6 lr=104 s->a歸約
stack[6]=13 n=11 lr=9 stack[7]=9 n=6 lr=105第五十一頁,共五十八頁,2022年,8月28日
L->s歸約
stack[6]=13 n=12 lr=16 stack[7]=16 n=6 lr=106 L->S;L歸約
stack[4]=4 n=12 lr=8 stack[5]=8 n=6 lr=12 stack[6]=12 n=10 lr=103 s->beginLend歸約
stack[3]=11 n=11 lr=15 stack[4]=15 n=10 lr=102第五十二頁,共五十八頁,2022年,8月28日
s->whileedos歸約
stack[0]=0 n=11 lr=1 stack[1]=1 n=10 lr=-2
************四元式分析結(jié)果***************** ********************************************
100(j>, a, b, 102 ) 101(j, , , 117 )第五十三頁,共五十八頁,2022
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足球基本技能訓(xùn)練-足球基本技能演示
- 法人退出免責(zé)協(xié)議書范文模板
- 祖遺戶遺產(chǎn)繼承協(xié)議書范文
- 買房返傭返款協(xié)議書范文
- 一方有個人債務(wù)離婚協(xié)議書范文
- 體育訓(xùn)練的心得體會8篇
- 運(yùn)動會班級入場解說詞15篇
- 幼兒園班主任工作實(shí)習(xí)計(jì)劃(3篇)
- 2024屆重慶市萬州龍駒中學(xué)普通高考模擬測試(一)數(shù)學(xué)試題
- 2024屆漳州市重點(diǎn)中學(xué)高三畢業(yè)生四月調(diào)研測試數(shù)學(xué)試題試卷
- 商務(wù)英語翻譯授課教案 第七單元
- 深圳高層次人才事項(xiàng)申請表
- 科學(xué)坐月子課件(PPT 31頁)
- 電瓶車風(fēng)險(xiǎn)管控措施告知牌
- 萵苣種植管理ppt課件(PPT 21頁)
- 英文文獻(xiàn)閱讀ppt課件(PPT 24頁)
- 醫(yī)院患者診療信息安全風(fēng)險(xiǎn)評估和應(yīng)急工作機(jī)制制定應(yīng)急預(yù)案XX醫(yī)院患者診療信息安全風(fēng)險(xiǎn)應(yīng)急預(yù)案
- 《國際經(jīng)濟(jì)法》課件國際貨物貿(mào)易法笫一講 國際貨物買賣合同
- 負(fù)荷計(jì)算表(完美版)
- 行政法及公務(wù)員法專題與參考答案及解析
- 12.4 n次方根
評論
0/150
提交評論