編譯 計算機科學(xué)技術(shù)系_第1頁
編譯 計算機科學(xué)技術(shù)系_第2頁
編譯 計算機科學(xué)技術(shù)系_第3頁
編譯 計算機科學(xué)技術(shù)系_第4頁
編譯 計算機科學(xué)技術(shù)系_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編譯原理實踐

--語義分析與代碼生成table數(shù)組和enter過程的擴充命令代碼生成過程gen表達式、項、因子及關(guān)系式的翻譯語句的翻譯生成PL/0目標(biāo)代碼程序1.table數(shù)組和enter過程的擴充lodl,a 將l,a形成的棧地址變量值置入棧頂stol,a將棧頂值保存到l,a形成的棧地址變量l level級別之差 變量所處的程序段靜態(tài)級別與 變量被說明時的靜態(tài)級別之差a offsetcall,a 調(diào)用子程序l level級別之差

call語句所處的程序段靜態(tài)級別與 調(diào)用過程被說明時的靜態(tài)級別之差a 被調(diào)用代碼程序段的起始地址必須將variable和procedure的level保存在合適的地方改變符號表,增加相應(yīng)的字段(P144圖11-1)object=(constant,variable,prozedure);table:array[0..txmax]of recordname:alfa; casekind: objectofconstant:(val:integer); variable,prozedure: (level,adr,size:integer); end;常量:val變量:靜態(tài)級別,位移地址Procedure:程序地址,靜態(tài)級別,預(yù)留存儲單元procedureenter(k:objekt);begin(*enterobjectintotable*)tx:=tx+1;withtable[tx]dobeginname:=id;kind:=k;casekofconstant:beginifnum>amaxthenbeginerror(31);num:=0end;val:=numend;variable:beginlevel:=lev;adr:=dx;dx:=dx+1;end;prozedure:level:=levendendend(*enter*);2.命令代碼生成過程gen每調(diào)用一次過程gen,在程序存儲器里產(chǎn)生一條代碼指令proceduregen(x:fct;y,z:integer);beginifcx>cxmaxthenbeginwrite('programtoolong');haltend;withcode[cx]dobeginf:=x;l:=y;a:=zend;cx:=cx+1end(*gen*);3.表達式、項、因子及關(guān)系式的翻譯表達式的翻譯中綴表達式與后綴表達式后綴表達式:操作符總是跟隨在它操作數(shù)的后邊后綴表達式翻譯規(guī)則T(“+”term)=T(term)T(“-”term)=T(term)“-”T(term1”+”term2)=T(term1)T(term2)“+”T(term1”-”term2)=T(term1)T(term2)“-”T(term1”*”term2)=T(term1)T(term2)“*”T(term1”/”term2)=T(term1)T(term2)“/”T(“(”expression”)”)=T(expression)Example(x+y)/(z-w)后綴表達式 xy+zw-/LodxLodyOpr0,2LodzLodwOpr0,3Opr0,5AnotherexampleT(x-6*(z+w)<(x+y)/(12-w))expression過程的擴充term過程的擴充factor過程的擴充condition過程的擴充4.語句的翻譯賦值語句的翻譯處理T(Ident”:=”expression)T(expression)Stolev-level,adrif語句的翻譯處理T(“if”condition“then”statement)T(condition)Jpc,L1T(statement)L1:…while語句的翻譯處理T(“while”condition“do”statement) L1: T(condition) Jpc,L2 T(statement) jmpL1 L2: …call語句的翻譯處理T(“call”ident) cal,lev-level,adr5.生成PL/0目標(biāo)代碼程序執(zhí)行program6在SI-NS圖上執(zhí)行program6直接從PL/0程序翻譯寫出目標(biāo)代碼程序?qū)Ψ殖绦虻亩x

procedure block(lev,tx:integer;fsys:symset);vardx:integer;(*dataallocationindex*)

tx0:integer;(*initialtableindex*)

cx0:integer;(*initialcodeindex*)(tx0是保留本過程名在名字表中的位置;

cx0

是保留本過程目標(biāo)代碼的起始位置)lev:本過程所在層次(主程序為0層)tx+1:本過程的標(biāo)識符在Table表中的起始位置fsys:出錯處理用分程序體的處理(程序)對分程序體入口的處理(P171頁block的過程體)

begin(*block*)

dx:=3;(為該過程變量分配存儲空間的起始位置,也就是相對基地址的偏移量)

tx0:=tx;(保留當(dāng)前table表指針值,是該過程名在table表中的位置)

table[tx].adr:=cx;(保留當(dāng)前code指針值到過程名的adr域)

gen(jmp,0,0);(生成轉(zhuǎn)向過程體入口的指令,地址待回填)分程序體的處理(程序)其中:

cx

已保留在過程名的adr域,等生成過程體入口的指令時,再由table[tx].adr中找到cx將過程體入口返填到cx中,即(jmp,0,0)的第3區(qū)域。同時將過程體入口填到過程名的table[tx].adr中。

CONSTA=35,B=49;

VARC,D,E;

PROCEDUREP;

VARG分程序的處理

名字類型層次/值地址存儲空間(0)jmp00CX:(1)jmp00table[tx].adr:=cx;記錄過程在code的入口到table中的adr域tx

過程體入口時的處理過程體入口時的處理code[table[tx0].adr].a:=cx;

(回填過程入口地址到code的a中)withtable[tx0]dobegin

adr:=cx;(過程的入口填寫在table中)

size:=dx;(過程占的空間填寫在table中)

end;

cxo:=cx;gen(int,0,dx);(生成過程入口指令)保留過程在code中的入口地址,打印目標(biāo)代碼用

CONSTA=35;B=49;

VARC,D,E;

PROCEDUREP;

VARG過程體入口時的處理

名字類型層次/值地址存儲空間(0)jmp00(1)

溫馨提示

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

最新文檔

評論

0/150

提交評論