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

下載本文檔

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

文檔簡介

5.5常見語法成分的翻譯簡單賦值語句布爾表達(dá)式條件語句循環(huán)語句過程調(diào)用語句說明語句數(shù)組一、簡單賦值語句(的四元式)翻譯四元式形式

(op,arg1,arg2,t)

~t:=arg1oparg2約定——P.180語義屬性:

E.place函數(shù):lookup();語義過程:

emit(t:=arg1oparg2);newtemp;

課本P.180產(chǎn)生式語義描述(1)S

id:=E{P:=lookup();ifPnilthenemit(P“:=”E.place)}(2)

EE1+E2{E.place:=newtemp;emit(E.place“:=”E1.place“+”E2.place)}(3)

E-E1{E.place:=newtemp;emit(E.place“:=”“uminus”E1.place)}(4)

E(E1){E.place:=E1.place}(5)

Eid{P:=lookup();ifPnilthenE.place:=Pelseerror}如果需要類型檢查,則還要考慮類型語義信息E.type見課本P.181二、布爾表達(dá)式的翻譯語法規(guī)則EEandEE

EorEE

notEE

idropidE

trueE

false優(yōu)先級別:not>and>or兩種翻譯方法一種類似于一般算術(shù)表達(dá)式的翻譯另一種則是作為控制條件轉(zhuǎn)移—P.182例:Aand(BorC)and(a>b)t1=BorCt2=Aandt1t3=a>bt4=t2andt31)ifAgoto3)2)gotoE.false3)ifBgoto7)4)goto5)5)ifCgoto7)6)gotoE.false7)ifa>bgotoE.true8)gotoE.false其中E.true,E.false分別表示表達(dá)式的真、假出口。

控制語句中布爾表達(dá)式的翻譯

控制語句S

ifEthenS1

elseS2

E的代碼

E.true

E.false

E.true:S1的代碼

gotoout

E.false:S2的代碼

out:

拉鏈(合并)與回填——P.184merge(p1,p2)backpatch(p,t)例:按照控制條件翻譯

a<bandc<dore>fandg>h100)ifa<bgoto–101)goto_102)ifc<dgoto–103)goto_104)ife>fgoto–105)goto_106)ifg>hgoto–107)goto_a<bandc<dore>fandg>h100)ifa<bgoto–102101)goto_104102)ifc<dgoto–103)goto_104104)ife>fgoto–106105)goto_106)ifg>hgoto

102107)goto_105E.true=106E.false=107a<bandc<dore>fandg>h三、條件語句SifEthenSSifEthenSelseS三、條件語句SifEthenSSifEthenSelseSSifE1thenifE2thenS1elseS2elseS3S.chain---P.187在翻譯完該語句后仍然無法確定轉(zhuǎn)移目的的鏈,需要在外層翻譯完后回填。為便于翻譯,進(jìn)行規(guī)則改寫:SCS1STpS2CifEthenTpCSelseSCS1STpS2CifEthen{backpatch(E.true,nextstat);C.chain=E.false}TpCSelseSCS1{S.chain:=merge(C.chain,S1.chain)}STpS2CifEthen{backpatch(E.true,nextstat);C.chain=E.false}TpCSelseSCS1{S.chain:=merge(C.chain,S1.chain)}STpS2CifEthen{backpatch(E.true,nextstat);C.chain=E.false}TpCSelse{emit(goto,-);Backpatch(C.chain,nextstat)Tp.chain:=merge(S.chain,?)}SCS1{S.chain:=merge(C.chain,S1.chain)}STpS2CifEthen{backpatch(E.true,nextstat);C.chain=E.false}TpCSelse{q:=nextstat;emit(goto,-);Backpatch(C.chain,nextstat)Tp.chain:=merge(S.chain,q)}SCS1{S.chain:=merge(C.chain,S1.chain)}STpS2{S.chain:=merge(Tp.chain,S2.chain)}CifEthen{backpatch(E.true,nextstat);C.chain=E.false}TpCSelse{q:=nextstat;emit(goto,-);Backpatch(C.chain,nextstat)Tp.chain:=merge(S.chain,q)}Example:ifathenifbthenA:=2elseA:=3四、循環(huán)語句SwhileEdoSSWdS3WdWEdoWwhileSWdS3WdWEdoWwhile{W.codebegin:=nextstat}SWdS3WdWEdo{backpatch(E.true,nextstat);Wd.chain:=E.false;Wd.codebegin:=W.codebegin}Wwhile{W.codebegin:=nextstat}SWdS3{backpatch(S3.chain,Wd.codebegin)emit(goto,Wd.codebegin)S.chain:=Wd.chain}WdWEdo{backpatch(E.true,nextstat);Wd.chain:=E.false;Wd.codebegin:=W.codebegin}Wwhile{W.codebegin:=nextstat}Example:whilea<bdoifc<dthenX:=Y+Z…………….復(fù)合語句的翻譯回填S.chainSbeginLendLLsS|SLsL;復(fù)合語句的翻譯SbeginLendLLsSLSLsL;{backpatch(L.chain,nextstat)}復(fù)合語句的翻譯SbeginLend{S.chain:=L.chain}LLsS{L.chain:=S.chain}LS{L.chain:=S.chain}LsL;{backpatch(L.chain,nextstat)}五、過程調(diào)用語句S

callp(E1,E2,E3,…En)Ei:常量,變量,表達(dá)式過程調(diào)用語句語義首先把實參傳遞給形參,然后把程序控制轉(zhuǎn)移到過程子程序,執(zhí)行該子程序;當(dāng)子程序執(zhí)行完后,返回調(diào)用點,執(zhí)行過程調(diào)用的下一條語句。參數(shù)類型:傳值;(callbyvalue)傳地址;(callbyreference)傳名;(callbyname)過程調(diào)用語句代碼形式實參E1的代碼;實參E2的代碼;…實參E1的結(jié)果傳遞到第一個形參;實參E2的結(jié)果傳遞到第二個形參;…跳轉(zhuǎn)到子程序(par,/,/,t)將參數(shù)T傳遞到一個公共的區(qū)域或者直接傳遞到過程的形式參數(shù)單元具體代碼由不同機(jī)器進(jìn)行再翻譯Scallp(arglist)arglistarglist1,EarglistEarglist.Queue——記錄每個實參Scallp(arglist)arglistarglist1,EarglistE{建立arglist.Queue空隊列將E.place添加到隊列尾}Scallp(arglist)arglistarglist1,E{將E.place添加到arglist1.Queue隊列尾arglist.Queue:=arglist1.Queue}arglistE{建立arglist.Queue空隊列將E.place添加到隊列尾}Scallp(arglist){n:=0;For隊列arglist.Queue中的每個元素qDO{Gen(par,/,/,q);n:=n+1}Gen(call,/,n,ENTRY(p));}arglistarglist1,E{將E.place添加到arglist1.Queue隊列尾arglist.Queue:=arglist1.Queue}arglistE{建立arglist.Queue空隊列將E.place添加到隊列尾}六、說明語句Dint<namelist>|float<namelist><namelist>id|<namelist>,id

id.typeid.attributeDD1,idDintidDfloatidP.197關(guān)于過程/函數(shù)中的說明語句局部符號表帶層次屬性的符號表七、數(shù)組數(shù)組的存儲方式數(shù)組元素的地址計算公式:D:=CONSTPART+VARPART變址取數(shù)四元式(=[],T1[T],/,X)([]=,X,/,T1[T])AV:=EVi[elist]|ielistelist,E|EEEopE|(E)|VD:=CONSTPART+VARPARTAV:=EVelist]|ielistelist,E|i[EEEopE|(E)|VAV:=EVelist]

Vielistelist,E

elisti[EEEopE|(E)|VP.184V.OFFSETV.PLACEelist.ARRAYelist.DIMdk=LIMIT(ARRAY,k)AV:=EVelist]Vielistelist,Eelisti[E{elist.DIM:=1;elist.ARRAY:=Entry(i)elist.place:=E.place;}EEopE|(E)|VAV:=EVelist]{t:=newtemp;GEN(-,elist.ARRAY,C,t);V.place:=t;V.offset:=elist.place}elist

溫馨提示

  • 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

提交評論