編譯原理-pl0實驗報告_第1頁
編譯原理-pl0實驗報告_第2頁
編譯原理-pl0實驗報告_第3頁
編譯原理-pl0實驗報告_第4頁
編譯原理-pl0實驗報告_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課程名稱編譯原理 題目名稱PL/0編譯程序 學(xué)生學(xué)院計算機科學(xué)與技術(shù)學(xué)院 專業(yè)班級 學(xué)號 學(xué)生姓名班內(nèi)序號 山東理工大學(xué)實驗..報告紙第1頁教師簽字鞠傳香教師簽字鞠傳香實驗編實驗編號(項1指導(dǎo)教師)1.熟悉pl/0語言并能編寫小程序2.掌1.熟悉pl/0語言并能編寫小程序2.掌握pl/0編譯程序的編譯過程(詞法分析、語法分析、語義分析等)實驗儀器(編號)材料、工具(原理概述)的子程序供語法分析程序調(diào)用。語法分析的同時,提供了出錯報告和出錯。<整數(shù)>∷=[+|-]<數(shù)字>{<數(shù)字>}<整數(shù)>∷=[+|-]<非零數(shù)字>{<數(shù)字>}|0(實驗內(nèi)容步驟)詞法分析PL完成以下工作:(1)跳過分隔符(如空格,回車,制表符);(3)識別非保留字的一般標識符,此標識符值(字符序列)賦給全局量id,而全局量sym賦值(4)識別數(shù)字序列,當(dāng)前值賦給全局量NUM,sym則置為SYM_NUMBER;(1)識別且跳過行結(jié)束符;(2)將輸入源文件復(fù)寫到輸出文件;(3)產(chǎn)生一份程序列表,輸出相應(yīng)行號或指令計數(shù)器的值。語法分析非終結(jié)符(S)程序體語句項identnumber(identnumber(callif.;以下是我們給出如何結(jié)合語法圖編寫(遞歸下降)語法分析程序的一般方法。假定圖S所對應(yīng)的(1)用合適的替換將語法約化成盡可能少的單個圖;(2)將每一個圖按下面的規(guī)則(3)-(7)翻譯成一個過程說明;(3)順序圖對應(yīng)復(fù)合語句:(4)選擇:LnTSnerror(5)循環(huán)(6)表示另一個圖A的圖:(7)表示終結(jié)符的單元圖:語義分析(1)是否存在標識符先引用未聲明的情況;(2)是否存在己聲明的標識符的錯誤引用;(3)是否存在一般標識符的多重聲明代碼生成PL/0編譯程序不僅完成通常的詞法分析、語法分析,而且還產(chǎn)生中間代碼和“目標”代碼。最終我們要“運行”該目標碼。為了使我們的編譯程序保持適當(dāng)簡單的水平,不致陷入與本課程無處理機。PL/0處理機順序解釋生成的目標代碼,我們稱之為解釋程序。注意:這里的假設(shè)與我們只能在一個解釋性的環(huán)境下予以模擬。從另一個角度上講,把解釋程PL/0處理機有兩類存貯,目標代碼放在一個固定的存貯數(shù)組code中,而所需數(shù)據(jù)組織成一個棧(1)LIT(2)LOD(3)STO(4)CAL(5)INT(6)JMP,JPC(7)OPR:FLAFINTLITLODCALL——————層次差層次差層次差—————————a常量常量數(shù)據(jù)地址數(shù)據(jù)地址程序地址程序地址程序地址運算類別上表中,層次差為變量名或過程名引用和聲明之間的靜態(tài)層次差別,程序地址為目標數(shù)組code的下標,數(shù)據(jù)地址為變量在局部存貯中的相對地址。于表達式、賦值語句、過程調(diào)用等的翻譯較簡單。如賦值語句X:=YopZ(op為某個運算符),將被翻譯成下面的目標代碼序列:(設(shè)指令計數(shù)從No.fLODLODLLevel_diff_Y——————Level_diff_XaYX的。為解決這一問題,我們在PL/0編譯程序中采用了回填技術(shù),即產(chǎn)生跳轉(zhuǎn)目標地址不明確的指令時,先保留這些指令的地址(code數(shù)組的下標),等到目標地址明確后再回過來將該跳轉(zhuǎn)指令的JMPL1表2-2if-while語句目標代碼生成模式相關(guān)過程(函數(shù))有:gen(),其任務(wù)是把三個參數(shù)f、l、a組裝成一條目標指令并存放于code代碼執(zhí)行為了簡單起見,我們假設(shè)有一個PL/0處理機,它能夠解釋執(zhí)行PL/0編譯程序所生成的目標代碼。這個PL/0處理機有兩類存貯、一個指令寄存器和三個地址寄存器組成。程序(目標代碼)存貯稱為code,由編譯程序裝入,在目標代碼執(zhí)行過程中保持不變,因此它可被看成是“只讀”存貯器。數(shù)據(jù)存貯S組織成為一個棧,所有的算術(shù)運算均對棧頂元和次棧頂元進行(一元運算僅作用于棧頂元),并用結(jié)果值代替原來的運算對象。棧頂元的地址(下標)記在棧頂寄存器T中,指IP將取出的指令。PL/0的每一個過程可能包含著局部變量,因為這些過程可以被遞歸地調(diào)用,故在實際調(diào)用前,用戶定義的變量外,還應(yīng)當(dāng)有它自己的內(nèi)部信息,即調(diào)用它的程序段地址(返回地址)和它的調(diào)用者的數(shù)據(jù)區(qū)地址。在過程終止后,為了恢復(fù)原來程序的執(zhí)行,這兩個地址都是必須的。我們可將這兩個內(nèi)部值作為位于該過程數(shù)據(jù)區(qū)的內(nèi)部式隱式局部變量。我們把它們分別稱為返回地址 因為實際的存貯分配是運行(解釋)時進行的,編譯程序不能為其生成的代碼提供絕對地址,它只能確定變量在數(shù)據(jù)區(qū)內(nèi)的位置,因此它只能提供相對地址。為了正確地存取數(shù)據(jù),解釋程序需將某個修正量加到相應(yīng)的數(shù)據(jù)區(qū)的基地址上去。若變量是局部于當(dāng)前正在解釋的過程,則此基地址由寄存器B給出,否則,就需要順著數(shù)據(jù)區(qū)的鏈逐層上去找。然而遺憾的是,編譯程序只能知道存取路線的表的長度,同時動態(tài)鏈保存的則是過程活動的動態(tài)歷史,而這兩條存取路線并不總是一樣。AABBBCACB圖2-1過程說明嵌套圖過程調(diào)用圖表示A調(diào)用B態(tài)鏈下降一步,將導(dǎo)致對C的局部變量的操作。為防止這種情況發(fā)生,有必要設(shè)置第二條鏈,它以編譯程序能明了的方式將各個數(shù)據(jù)區(qū)連接起來。我們稱之為靜態(tài)鏈(staticlink)SL。這樣,編譯程序所生成的代碼地址是一對數(shù),指示著靜態(tài)層差和數(shù)據(jù)區(qū)的相對修正量。下面我們給出的是DLRASLA的變量B的變量CB的變量ZPL驟”如下:T--;//棧頂指針指向次棧頂元,即存放結(jié)果的單元//將棧頂?shù)闹荡娣诺阶兞縓所在的單元T--;//棧頂指針減一錯誤診斷處理一個編譯程序,在多數(shù)情況下,所接受的源程序正文都是有錯誤的。發(fā)現(xiàn)錯誤,并給出合適的診斷信息且繼續(xù)編譯下去從而發(fā)現(xiàn)更多的錯誤,對于編譯程序而言是完全必要的。一個好的編譯任何輸入序列都不會引起編譯程序的崩潰。一切按語言定義為非法的結(jié)構(gòu),都能被發(fā)現(xiàn)和標志出來。經(jīng)常出現(xiàn)的錯誤,程序員的粗心或誤解造成的錯誤能被正確地診斷出來,而不致引起進一(1)關(guān)鍵字規(guī)則;程序員在寫程序時,可能會因為粗心而漏掉語句的分隔符——“;”,但他決不會漏掉算術(shù)運算符“+”,對于編譯程序而言,不論是分隔符號類的符號還是關(guān)鍵字符號類的符號,它們都具有同等重要的地位?;谶@樣的特點,我們可以采用不易出錯的部分來作為恢復(fù)正常步調(diào)的標記。每當(dāng)遇到錯誤時,分析程序跳過后面的某些部分,直到出現(xiàn)所期望的符號為止。對于程序設(shè)計語言來說,這種符號(稱為同步符號)的最好選擇就是關(guān)鍵字。PL/0的每一種構(gòu)造e(2)鎮(zhèn)定規(guī)則;自頂向下分析的特點在于目標對分成一些子目標,分程序則用別的分析程序來處理其子目標。鎮(zhèn)定規(guī)則是說一個分析程序發(fā)現(xiàn)了錯誤,它不應(yīng)該消極地停止前進,僅僅向調(diào)用它的程序報告發(fā)生的錯誤;而應(yīng)該自己繼續(xù)向前掃描,找到似乎可以使正常的分析得以恢復(fù)的地方。這一規(guī)則在程序設(shè)計上的含義就是任一分析程序除了正常終止外,沒有其它出口。鎮(zhèn)定規(guī)則,一個可能的嚴格解釋為:一旦發(fā)現(xiàn)非法結(jié)構(gòu),即跳過后面的輸入正文,直到下一個可以正確地跟隨當(dāng)前正在分析的句子結(jié)構(gòu)的符號為止。這意味著每一分析程序需知道其當(dāng)前活動結(jié)點的后繼符號集合。指明可能的后繼集合。不過在任何條件下,如果都跳到輸入正文中下一個這種后繼符號出現(xiàn)的地方,未免太短視了。程序中所含的錯誤可能只不過是漏掉了一個符號(如“;”)而己,由此而忽略作為參數(shù)傳遞給分析過程的那些符號就不僅是后繼符號了。對于這樣的符號集,我們采用這樣的計算策略:先用一些明顯的關(guān)鍵符號給它賦初值,然后隨著分析子目標的層次深入,逐步補充別的合法符號。為了靈活起見,我們引入test子程序來實現(xiàn)作。(1)可允許的下一個符號集合S1,如果當(dāng)前符號不在此集合中,當(dāng)即得到一個錯誤號;(3)整數(shù)n,表示有關(guān)錯誤的診斷號:{error(n);}}我們前面提出的方案,具有這樣的性質(zhì):試圖通過略過輸入正文中的一個或多個符號來恢復(fù)分析的正常步調(diào)。在錯誤僅為漏掉一個符號所引起的情況下,它都是不適宜的策略。經(jīng)驗表明,這類錯誤基本上限于那種僅有語法作用,而不代表動作的符號(如“;”)。把一些關(guān)鍵字加到后繼符號集合中去可使分析程序不再盲目地跳過后面的符號,好象漏掉的已經(jīng)補上去一樣。下面程序段集合是“語句”這個結(jié)構(gòu)的首符號集。N{getsym();L{if(sym==SYM_SEMICOLON){getsym();{error(10);le{getsym();}else}}符號表管理為了組成一條指令,編譯程序必須知道其操作碼及其參數(shù)(數(shù)或地址)。這些值是由編譯程序本身聯(lián)系到相應(yīng)標識符上去的。這種聯(lián)系是在處理常數(shù)、變量和過程說明完成的。為此,標識符表應(yīng)包含每一標識符所聯(lián)系的屬性;如果標識符被說明為常數(shù),其屬性值為常數(shù)值;如果標識符被說明成變量,其屬性就是由層次和修正量(偏移量)組成的地址;如果標識符被說明為過程,其屬性就是過程的入口地址及層次。常數(shù)的值由程序正文提供,編譯的任務(wù)就是確定存放該值的地址。我們選擇順序分配變量和代碼的方法;每遇到一個變量說明,就將數(shù)據(jù)單元的下標加一(PL/0機中,每個變量占一個存貯單dx完成。注意,每個分程序(過程)的第一條指令未被列出。該指令是跳轉(zhuǎn)指令。其作用是繞過該分程序的說明部分所產(chǎn)生的代碼(含過程說明所產(chǎn)生的代碼)。(2)解釋程序作為PL/0編譯程序的一個過程,若被編譯的源代碼沒有錯誤,則編譯結(jié)束時調(diào)(3)PL/0語言沒有輸出語句。解釋程序按執(zhí)行次序,每遇到對變量的賦值就輸出其值。PL/0語言源程序f:=x;(數(shù)據(jù)記錄表及處理)生成的代碼(片段)PL段程序,其中乘法過程經(jīng)過編譯程序產(chǎn)生以下代碼:2INT05--allocatestorage3LOD13--x4STO03--a5LOD14--y6STO04--b7LIT00--08STO15--z9LOD04--b10LIT00--011OPR012-->JPCifb<=0thengoto2913LOD04--b14OPR06--odd15JPC020--ifnot(odd(b))goto20if16LOD15--z17LOD03--a18OPR02--+19STO15--z20LIT02 221LOD03--a22OPR04--*23STO03--a24LOD04--b0202--202--/04--b09--goto900--return25LITOPR27STO28JMPOPR(1)擴充賦值運算:+=,-=.此功能擴充只需在語句分析里面進行增加如下程序:{}{GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}}}if(i!=0)GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);} (2)增加條件語句的ELSE子ELSE語句的語法語義分

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論