編譯原理實(shí)驗(yàn)_第1頁
編譯原理實(shí)驗(yàn)_第2頁
編譯原理實(shí)驗(yàn)_第3頁
編譯原理實(shí)驗(yàn)_第4頁
編譯原理實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)學(xué)院綜合性實(shí)驗(yàn)報(bào)告華北科技學(xué)院計(jì)算機(jī)學(xué)院綜合性實(shí)驗(yàn)實(shí) 驗(yàn) 報(bào) 告 課程名稱 編譯原理 實(shí)驗(yàn)學(xué)期 2015 至 2016 學(xué)年 第 二 學(xué)期學(xué)生所在院部 計(jì)算機(jī)學(xué)院 年級 2013 專業(yè)班級 計(jì)科B 學(xué)生姓名 學(xué)號 201307014 任課教師 王養(yǎng)廷 實(shí)驗(yàn)成績 計(jì)算機(jī)學(xué)院制開課實(shí)驗(yàn)室:軟件開發(fā)實(shí)驗(yàn)室 2016 年 5月 18日實(shí)驗(yàn)題目分析中間代碼生成程序一、實(shí)驗(yàn)?zāi)康姆治鯬L/0編譯程序的總體結(jié)構(gòu)、代碼生成的方法和過程;具體寫出一條語句的中間代碼生成過程。二、設(shè)備與環(huán)境PC兼容機(jī)、Windows操作系統(tǒng)、Turbo Pascal軟件等。三、實(shí)驗(yàn)內(nèi)容1. 分析PL/0程序的Block子程序,

2、理清PL/0程序結(jié)構(gòu)和語句格式。畫出Block子程序的流程圖,寫出至少兩條PL/0程序語句的語法格式。2. 分析PL/0程序的Block子程序和Gen子程序,了解代碼生成的方法和過程。使用概要算法來描述語句的代碼生成過程。3. 自己編寫一個簡單的PL/0程序,能夠正確通過編譯,得到中間代碼。列出自己編寫的源程序和編譯后得到的中間代碼。4. 從中選擇一個語句或表達(dá)式,寫出代碼生成的過程。要求從自己的源程序中選擇一條語句,結(jié)合這條語句寫出語義分析和代碼生成過程。在描述這個過程中,要說清楚每個功能有哪個子程序的哪條語句來完成,說清楚語句和參數(shù)的含義和功能。四、實(shí)驗(yàn)結(jié)果及分析(一)程序標(biāo)注(常量聲明處

3、理過程constdeclaration *) procedure constdeclaration; begin if sym = ident then/ 常量聲明過程開始遇到的第一個符號必然應(yīng)為標(biāo)識符 begin getsym; if sym in eql, becomes then/如果是等號或賦值號 begin if sym = becomes/如果是賦值號(常量生明中應(yīng)該是等號) then error(1); getsym;/ 獲取下一個token, 等號或賦值號后應(yīng)接上數(shù)字 if sym = number then/如果的確是數(shù)字 begin enter(constant);/ 把這

4、個常量登陸到符號表 getsym/獲取下一個token,為后面作準(zhǔn)備 end else error(2)/ 如果等號后接的不是數(shù)字,拋出2號錯誤 end else error(3)/ 如果常量標(biāo)識符后接的不是等號或賦值號,拋出3號錯誤 end else error(4)/ 如果常量聲明過程遇到的第一個符號不為標(biāo)識符,拋出4號錯誤 end constdeclaration; (* 變量聲明過程vardeclaration *) procedure vardeclaration; begin if sym = ident then/ 變量聲明過程vardeclaration begin enter

5、(varible); 將標(biāo)識符登陸到符號表中/ getsym end else error(4)/ 如果變量聲明過程遇到的第一個符號不是標(biāo)識符,拋出4號錯誤 end vardeclaration;(二)過程說明說明入口參數(shù),返回值和過程的功能1、入口參數(shù):過程體入口時的處理codetabletx0.adr.a:=cx;(cx為過程入口地址,填寫在code中)with tabletx0 do begin adr:=cx; (過程的入口填寫在table表的過程名中)size:=dx; (過程需要的空間填寫在table中)end;cxo:=cx; (保留過程在code中的入口地址

6、在輸出目標(biāo)代碼時用) gen(int,0,dx);(生成過程入口指令)2、返回值:(* 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)基地址的函數(shù)base *) (* 參數(shù)說明:l:要求的數(shù)據(jù)區(qū)所在層與當(dāng)前層的層差 *) (* 返回值:要求的數(shù)據(jù)區(qū)基址 *) function base(l: integer): integer; var b1: integer; begin b1 := b; (* find base 1 level down *) (* 首先從當(dāng)前層開始 *) while l > 0 do (* 如果l大于0,循環(huán)通過靜態(tài)鏈往前找需要的數(shù)據(jù)區(qū)基址 *) begin b1 := sb1;

7、 (* 用當(dāng)前層數(shù)據(jù)區(qū)基址中的內(nèi)容(正好是靜態(tài)鏈SL數(shù)據(jù),為上一層的基址)的作為新的當(dāng)前層,即向上找了一層 *) l := l - 1 (* 向上了一層,l減一 *) end; base := b1 (* 把找到的要求的數(shù)據(jù)區(qū)基址返回 *) end(* base *);(三)程序靜態(tài)結(jié)構(gòu)圖(四)PL0文法描述在計(jì)算機(jī)科學(xué)中,文法是編譯原理的基礎(chǔ),是描述一門程序設(shè)計(jì)語言和實(shí)現(xiàn)其編譯器的方法。文法的描述多用BNF(巴克斯范式),而另一個重要的概念:正則表達(dá)式,也是文法的另一種形式。PL/0文法的表示:<程序>:= <分程序>.<分程序>:= <常量說明部分

8、><變量說明部分><過程說明部分><語句><常量說明部分>:= const<常量定義>,<常量定義><常量定義>:= <標(biāo)識符>=<無符號整數(shù)><無符號整數(shù)>:= <數(shù)字><數(shù)字><標(biāo)識符>:= <字母><字母>|<數(shù)字><變量說明部分>:= var<標(biāo)識符>, <標(biāo)識符><過程說明部分>:= <過程首部><分程序><過程

9、說明部分><過程首部>:= procedure<標(biāo)識符><語句>:= <賦值語句>|<條件語句>|<當(dāng)循環(huán)語句>|<過程調(diào)用語句>|<復(fù)合語句>|<讀語句>|<寫語句>|<空> <賦值語句>:= <標(biāo)識符> := <表達(dá)式><表達(dá)式>:= +|-<項(xiàng)><加法運(yùn)算符><項(xiàng)><項(xiàng)>:= <因子><乘法運(yùn)算符><因子><因子&g

10、t;:= <標(biāo)識符>|<無符號整數(shù)>| ( <表達(dá)式> ) <加法運(yùn)算符>:= +|-<乘法運(yùn)算符>:= *|/<條件>:= <表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式>|odd<表達(dá)式><關(guān)系運(yùn)算符>:= =|<>|<|<=|>|>=<條件語句>:= if<條件>then<語句><當(dāng)循環(huán)語句>:= while<條件>do<語句> <過程調(diào)用語句>:= c

11、all<標(biāo)識符> <復(fù)合語句>:= begin<語句><語句>end<讀語句>:= read ( <標(biāo)識符>, <標(biāo)識符> ) <寫語句>:= write ( <表達(dá)式>, <表達(dá)式> ) <字母>:= a|b|c|d.x|y|z <數(shù)字>:= 0|1|2|3.8|9(五)代碼生成程序說明對分程序體入口的處理(見程序文本block 的過程體) begin (*block*) dx:=3; tx0:=tx; (*保留當(dāng)前table表指針值,實(shí)際為過程名在

12、table表中的位置*) tabletx.adr:=cx;(*保留當(dāng)前code指針值到過程名的adr域*) gen(jmp,0,0);(*生成轉(zhuǎn)向過程體入口的指令,該指令的地址為cx已保留在過程名的adr域,真正的過程體入口地址,等生成過程體入口的指令時,再由tabletx.adr中取出 cx將過程體入口返填到cx所指目標(biāo)代碼,即:(jmp,0,0)的第3區(qū)域,同時填到tabletx.adr 中*)過程體入口時的處理codetabletx0.adr.a:=cx;(cx為過程入口地址,填寫在code中)with tabletx0 do begin adr:=cx; (過程的入

13、口填寫在table表的過程名中)size:=dx; (過程需要的空間填寫在table中)end;cxo:=cx; (保留過程在code中的入口地址在輸出目標(biāo)代碼時用) gen(int,0,dx);(生成過程入口指令)table表格管理(六)代碼生成程序?qū)嵗o出pl0源程序,中間代碼和過程說明編寫代碼:const x=4;var a,b;procedure try;begin b:=a*x-x;end;begin a:=5; call try;end.運(yùn)行程序如圖:五、實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)讓我學(xué)到了許多,通過運(yùn)行THPL0CAI程序,掌握了符號表的建立過程,及運(yùn)行過程中運(yùn)行棧的變化過程。了解了PL/0語言是PASCAL語言的子集和指令功能表.但是在編碼過程中暴露的問題是我們今后需要改進(jìn)的地方

溫馨提示

  • 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

提交評論