程序設(shè)計(jì)語言編譯原理(第三版)第7章.ppt
《程序設(shè)計(jì)語言編譯原理(第三版)第7章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《程序設(shè)計(jì)語言編譯原理(第三版)第7章.ppt(67頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1,第七章語義分析和中間代碼產(chǎn)生,一般情況下,在詞法分析程序和語法分析程序?qū)υ闯绦虻恼Z法結(jié)構(gòu)進(jìn)行分析之后,要么,由語法分析程序直接調(diào)用相應(yīng)的語義子程序進(jìn)行語義處理;要么,首先生成語法樹或該結(jié)構(gòu)的某種表示,再進(jìn)行語義處理。,2,語義處理分兩步:1.靜態(tài)語義分析,即驗(yàn)證語法結(jié)構(gòu)合法的程序是否真正有意義。2.若靜態(tài)語義正確,語義處理則要執(zhí)行真正的翻譯。即要么生成程序的一種中間表示形式(中間代碼),要么生成實(shí)際的目標(biāo)代碼。,靜態(tài)語義檢查包括:(1)類型檢查;(2)控制流檢查;(3)一致性檢查;(4)相關(guān)名字檢查。,第七章語義分析和中間代碼產(chǎn)生,3,中間代碼:即中間語言,獨(dú)立于機(jī)器的,復(fù)雜性介于源語言和機(jī)器語言之間的一種表示形式。,采用中間語言的好處:,第七章語義分析和中間代碼產(chǎn)生,(1)便于進(jìn)行與機(jī)器無關(guān)的代碼優(yōu)化工作;,(2)使編譯程序改變目標(biāo)機(jī)更容易;,(3)使編譯程序的結(jié)構(gòu)在邏輯上更為簡單明確。,4,,7.1中間語言7.2說明語句7.3賦值語句的翻譯7.4布爾表達(dá)式的翻譯7.5控制語句的翻譯7.6過程調(diào)用的處理(略)7.7類型檢查(略),第七章語義分析和中間代碼產(chǎn)生,5,7.1中間語言,中間語言形式:后綴式三地址代碼圖表示法,6,一、后綴式—逆波蘭式:,規(guī)則:,7.1中間語言,(1)E-常量/變量:后綴式為E本身,(2)E-E1opE2:E1’E2’op,(3)E-(E1):(E1’),(4)E-opE1:E1’op,7,7.1中間語言,例子:,a*(b+c)—,(a+b)*(c+d)—,abc+*,x+y≤z∨a>0∧(8+z)>3—,ab+cd+*,xy+z≤a0>8z+3>∧∨,8,二、圖表示法,1.DAG(無循環(huán)有向圖)與抽象語法樹對(duì)比相同點(diǎn):對(duì)表達(dá)式中的每個(gè)子表達(dá)式,它們都有一個(gè)結(jié)點(diǎn),一個(gè)內(nèi)部結(jié)點(diǎn)代表一個(gè)操作符,它的孩子代表操作數(shù);不同點(diǎn):在一個(gè)DAG中代表公共子表達(dá)式的結(jié)點(diǎn)具有多個(gè)父結(jié)點(diǎn),而在一棵抽象語法樹中公共子表達(dá)式被表示為重復(fù)的子樹。,7.1中間語言,9,例子:如圖所示,為a+a*(b-c)+(b-c)*d的DAG,7.1中間語言,10,2.抽象語法樹,例子:(1)a:=b*-c+b*-c的圖表示法,7.1中間語言,11,(2)a:=b*-c+b*-c的抽象語法樹的兩種表示法,012345678910,7.1中間語言,12,三、三地址代碼,1.三地址代碼:下面一般形式的語句構(gòu)成的序列:x:=yopz?T1:=y*z,T2:=x+T1,稱為三地址代碼的原因:每條語句通常包含三個(gè)地址,兩個(gè)用來表示操作數(shù),一個(gè)用來存放結(jié)果。,7.1中間語言,具體實(shí)現(xiàn):用記錄表示,其中包含運(yùn)算符和操作數(shù)的域。,x,y,z:名字,常數(shù),編譯時(shí)產(chǎn)生的臨時(shí)變量op:運(yùn)算符號(hào)(如定點(diǎn)運(yùn)算符,浮點(diǎn)運(yùn)算符,邏輯運(yùn)算符等),13,2.四元式:帶有四個(gè)域的記錄結(jié)構(gòu),7.1中間語言,(op,arg1,arg2,result),14,7.1中間語言,例子:三地址語句a:=b*-c+b*-c的四元式表示,四元式表示,15,3.三元式:為了避免把臨時(shí)變量填入符號(hào)表,可通過計(jì)算該臨時(shí)變量值的語句的位置來引用該臨時(shí)變量。,7.1中間語言,(op,arg1,arg2),16,7.1中間語言,例子:三地址語句a:=b*-c+b*-c的三元式表示,17,4.間接三元式:便于代碼優(yōu)化處理方法:間接碼表+三元式表,例:語句X:=(A+B)*C;Y:=D↑(A+B)的間接三元式表示如下所示:,三元式表,7.1中間語言,18,7.2說明語句,編譯過程中,對(duì)“說明語句”要做的工作:,對(duì)一個(gè)過程或分程序的一系列說明語句,考察時(shí):,(1)需要為局部于該過程的名字分配存儲(chǔ)空間;,(2)對(duì)每個(gè)局部名字,都需在符號(hào)表中建立相應(yīng)的表項(xiàng),并填入有關(guān)的信息如類型、在存儲(chǔ)器中的相對(duì)地址等。,19,一、過程中的說明語句,1.產(chǎn)生“說明語句”的文法:,P?DD?D;DD?id:TT?integerT?realT?array[num]ofT1T?↑T1,7.2說明語句,20,2.處理方式:處理第一條說明語句之前,先置offset為0,以后每次遇到一個(gè)新的名字,則:(1)將該名字填入符號(hào)表中,(2)置相對(duì)地址為當(dāng)前offset之值,(3)使offset加上該名字所表示的數(shù)據(jù)對(duì)象的域?qū)挕?7.2說明語句,21,3.相應(yīng)的翻譯模式:,7.2說明語句,P?DD?D;DD?id:TT?integerT?realT?array[num]ofT1T?↑T1,{offset:=0},{enter(id.name,T.type,offset);offset:=offset+t.width},{T.type:=integer;T.width:=4},{T.type:=real;T.width:=8},{T.type:=array(num.val,T1.type);T.width:=num.valT1.width},{T.type:=pointer(T1.type);T.width:=4},22,說明:(1)offset:全程變量,代表變量在過程數(shù)據(jù)區(qū)中的相對(duì)地址,用來跟蹤下一個(gè)可用的相對(duì)地址的位置.,7.2說明語句,(2)enter(name,type,offset):把名字name?符號(hào)表,并給出此名字的類型type及在過程數(shù)據(jù)區(qū)中的相對(duì)地址offset.,(3)綜合屬性:T.type-名字的類型;T.width-名字的域?qū)?即該類型名字所占用的存儲(chǔ)單元個(gè)數(shù)),23,二、保留作用域信息,1.嵌套過程中的說明語句,7.2說明語句,(1)相應(yīng)的文法:P?DD?D;D|id:T|procid;D;S,(2)程序舉例:,24,7.2說明語句,2.含嵌套說明的翻譯模式:,P→MD{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)},M→?{t:=mktable(nil);push(t,tblptr);push(0,offset)},D→D1;D2,D→procid;ND1;S{t:=top(tblptr);addwidth(t,top(offset));pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t)},N→?{t:=mktable(top(tblptr));push(t,tblptr);push(0,offset)},D→id:T{enter(top(tblptr),id.name,T.type,top(offset));top(offset):=top(offset)+T.width},25,(1)語義規(guī)則中的操作:,7.2說明語句,2.含嵌套說明的翻譯模式:,Mktable(previous):創(chuàng)建一張新符號(hào)表,并返回指向新表的一個(gè)指針;,Enter(table,name,type,offset):在指針table指示的符號(hào)表中為名字name建立一個(gè)新頂,并把類型type、相對(duì)地址offset填入到該項(xiàng)中;,26,7.2說明語句,(1)語義規(guī)則中的操作:,Enterproc(table,name,newtable):在指針table指示的符號(hào)表中為名字name的過程建立一個(gè)新頂。參數(shù)newtable指向過程name的符號(hào)表。,Addwidth(table,width):在指針table指示的符號(hào)表表頭中記錄下該表中所有名字占用的總寬度;,27,(2)棧:tblptr:存放指向符號(hào)表的指針,棧頂為指向當(dāng)前正在處理過程的符號(hào)表指針.offset:存放變量在數(shù)據(jù)區(qū)中的相對(duì)地址,棧頂為當(dāng)前正在處理過程的下一個(gè)變量的相對(duì)地址。,(3)top(…):取當(dāng)前棧頂元素push(a,B):將a推進(jìn)B棧棧頂pop(A):將A棧棧頂元素出棧,7.2說明語句,28,7.3賦值語句的翻譯,一、簡單算術(shù)表達(dá)式及賦值語句,1.產(chǎn)生“賦值語句”三地址代碼的翻譯模式:,S?id:=E{p:=lookup(id.name);ifp≠nilthenemit(p‘:=’E.place)elseerror},E?E1+E2{E.place:=newtemp;emit(E.place‘:=’E1.place‘+’E2.place)},E?E1*E2{E.place:=newtemp;emit(E.place‘:=’E1.place‘*’E2.place)},E?-E1{E.place:=newtemp;emit(E.place‘:=’‘uminus’E1.place)},E?(E1){E.place:=E1.place},E?id{p:=lookup(id.name);ifp≠nilthenE.place:=pelseerror},29,2.說明:id.name-id所代表的名字本身lookup(id.name)-檢查符號(hào)表中是否存在相應(yīng)此名字的入口?≠nil:返回一個(gè)該表項(xiàng)的指針=nil:未找到emit(--)-將生成的三地址語句發(fā)送到輸出文件中E.place-存放E值的名字newtemp-產(chǎn)生“臨時(shí)變量”,7.3賦值語句的翻譯,30,3.例題:寫出下列代碼段中表達(dá)式的翻譯制導(dǎo)過程及其所產(chǎn)生的四元式beginInteger:B、C、D、X;X:=-B*(C+D);end,符號(hào)表<B><C><D><X>,四元式,7.3賦值語句的翻譯,31,已歸約串PLACE輸入串語義動(dòng)作#X:=-B*(C+D)##XX:=-B*(C+D)##X:=X_-B*(C+D)##X:=-X__B*(C+D)##X:=-BX__B*(C+D)##X:=-EX__B*(C+D)#{E.place:=p=}#X:=E1X_T1*(C+D)#{E1.place:=newtemp=T1;生成四元式(1)}…………#X:=E*(CX_T1__C+D)##X:=E*(E1X_T1__C+D)#{E1.place:=p=}…………,32,已歸約串PLACE輸入串語義動(dòng)作…………#X:=E*(E1+DX_T1__C_D)##X:=E*(E1+E2X_T1__C_D)#{E2.place:=p=}#X:=E*(E3X_T1__T2)#{E3.place:=newtemp=T2;生成四元式(2)}#X:=E*(E3)X_T1__T2_##X:=E*E4X_T1_T2#{E4.place=E3.place=T2}#X:=E5X_T3#{E5.place=T3;生成四元式(3)}#S#{p:=lookup(X.name);生成四元式(4)},33,二、數(shù)組元素的引用,1.數(shù)組元素在存儲(chǔ)器中的存放:,7.3賦值語句的翻譯,一維數(shù)組地址:,二維數(shù)組地址:,A[i]的地址=base+(i-low)*w=i*w+(base-low*w),A[i1,i2]的地址=base+((i1–low1)*n2+i1-low2)*w=((i1*n2)+i2)*w+(base–((low1*n2)+low2)*w),34,7.3賦值語句的翻譯,1.數(shù)組元素在存儲(chǔ)器中的存放:,二、數(shù)組元素的引用,k維數(shù)組地址:,C=((…((low1n2+low2)n3+low3)…)nk+lowk)*w,變量部分:(…((i1n2+i2)n3+i3)…)nm+ime1=i1,em=em-1*nm+im,A[i1,i2,…,ik]的地址=((…i1n2+i2)n3+i3)…)nk+ik)*w+base–((…((low1n2+low2)n3+low3)…)nk+lowk)*w,35,改寫產(chǎn)生式的原因:使我們?cè)谡麄€(gè)下標(biāo)表達(dá)式串Elist的翻譯過程中隨時(shí)都能知道符號(hào)表中相應(yīng)于數(shù)組名字id的符號(hào)表入口,從而隨時(shí)能了解登記在符號(hào)表中的有關(guān)數(shù)組id的全部信息。,7.3賦值語句的翻譯,36,3.數(shù)組元素的翻譯模式:A.文法:(1)S?L:=E(2)E?E+E(3)E?(E)(4)E?L(5)L?Elist](6)L?id(7)Elist?Elist,E(8)Elist?id[E,7.3賦值語句的翻譯,37,B.說明:id.place-id的符號(hào)表入口.E.place-存放E的名字/值.L.offset-=null,L為簡單名字;≠null,L為數(shù)組元素引用,存放臨時(shí)變量的值.(變量部分的值)L.place-L-簡單名字,則指向符號(hào)表中相應(yīng)此名字表項(xiàng)的指針,即此名字的符號(hào)表入口.L-數(shù)組引用,則L.place存放臨時(shí)變量的值.(常量部分的值),7.3賦值語句的翻譯,38,7.3賦值語句的翻譯,B.說明:Elist.array-用來記錄指向符號(hào)表中相應(yīng)數(shù)組名字表項(xiàng)的指針?數(shù)組變量的符號(hào)表入口Elist.place-表示臨時(shí)變量,用來臨時(shí)存放由Elist中的下標(biāo)表達(dá)式計(jì)算出的值。Elist.ndim-記錄Elist中的下標(biāo)表達(dá)式的個(gè)數(shù),即維數(shù)。Limit(array,j)-返回nj,即由array所指示的數(shù)組的第j維長度。,39,7.3賦值語句的翻譯,C.翻譯模式,S→L:=E{ifL.offset=nullthenemit(L.place:=E.place)elseemit(L.place[L.offset]:=E.place)},(2)E→E1+E2{E.place:=newtemp;Emit(E.place:=E1.place+E2.place)},(3)E→(E1){E.place:=E1.place},40,7.3賦值語句的翻譯,(4)E→L{ifL.offset=nullthenE.place:=L.placeelsebeginE.place:=newtemp;emit(E.place:=L.place[L.offset])end},(5)L→Elist]{L.place:=newtemp;emit(L.place:=Elist.array-C);L.offset:=newtemp;emit(L.offset:=w*Elist.place)},(6)L→id{L.place:=id.place;L.offset:=null},41,7.3賦值語句的翻譯,(7)Elist→Elist1,E{t:=newtemp;m:=Elist1.ndim+1;emit(t:=Elist1.place*limit(Elist1.array,m));emit(t:=t+t.place)Elist.array:=Elist1.array;Elist.place:=t;Elist.ndim:=m},(8)Elist→id[E{Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place},42,4.舉例已知:A為1020的數(shù)組,即n1=10,n2=20,設(shè)w=4,x:=A[y,z]x:=A[y,z]?其相應(yīng)的三地址語句序列如下:(1)T1:=y*20(2)T1:=T1+z(3)T2:=A-84(4)T3:=4*T1(5)T4:=T2[T3](6)x:=T4,7.3賦值語句的翻譯,43,7.4布爾表達(dá)式的翻譯,前言:,2.布爾表達(dá)式的組成及形式組成:布爾運(yùn)算符號(hào)、布爾變量、關(guān)系表達(dá)式and,or,not(,≥)形式:E1relopE2,1.布爾表達(dá)式的兩個(gè)基本作用(1)用來計(jì)算邏輯值(2)用作控制流語句的條件表達(dá)式,44,7.4布爾表達(dá)式的翻譯,3.產(chǎn)生布爾表達(dá)式的文法:E?EorEE?EandEE?notEE?(E)E?idrelopidE?id,45,一、數(shù)值表示法,1.計(jì)算布爾表達(dá)式值的兩種方法:,7.4布爾表達(dá)式的翻譯,(1)逐步計(jì)算(與算術(shù)表達(dá)式計(jì)算類似)例:1or(not0and0)or0=1or(1and0)or0=1or0or0=1or0=1,(2)采取某種優(yōu)化措施AorB-ifAthenTelseBAandB-ifAthenBelseFnotA-ifAthenFelseT,46,2.采取“逐步計(jì)算法”計(jì)算布爾表達(dá)式,7.4布爾表達(dá)式的翻譯,(2)關(guān)系式a- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 程序設(shè)計(jì)語言 編譯 原理 第三
鏈接地址:http://m.appdesigncorp.com/p-11546702.html