版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一、課程設(shè)計(jì)要求</b></p><p> 設(shè)計(jì)題目:PL/0編譯器及其擴(kuò)充。</p><p> 設(shè)計(jì)內(nèi)容:對(duì)PL/0語(yǔ)言進(jìn)行擴(kuò)充的內(nèi)容為:</p><p> 1、增加運(yùn)算符定義,如++、--、+=、-=等;</p><p> 2、擴(kuò)充語(yǔ)句定義,如else,for, switch…c
2、ase,continue等;</p><p> 3、增加數(shù)據(jù)類型,在現(xiàn)有整型、邏輯型基礎(chǔ)上增加實(shí)型,數(shù)組類型,記錄類型或結(jié)構(gòu)體類型等;</p><p> 4、增加函數(shù)調(diào)用功能,進(jìn)一步擴(kuò)充帶參數(shù),返回值的函數(shù)功能;</p><p> 5、增加類,補(bǔ)充封裝、繼承、多態(tài)等面向?qū)ο筇匦裕蛇x)。</p><p><b> 二、實(shí)驗(yàn)環(huán)
3、境與工具</b></p><p> 計(jì)算機(jī)及操作系統(tǒng):PC機(jī),Windows2000,WindowsXP</p><p><b> 程序設(shè)計(jì)語(yǔ)言:C</b></p><p> 教學(xué)型編譯程序:PL/0 </p><p><b> 源語(yǔ)言:C語(yǔ)言</b></p>&l
4、t;p> 實(shí)現(xiàn)工具:Visual C++ 6.0</p><p> 運(yùn)行平臺(tái):Windows 7</p><p> 三、結(jié)構(gòu)設(shè)計(jì)說(shuō)明與功能塊描述</p><p><b> 1.結(jié)構(gòu)設(shè)計(jì)說(shuō)明</b></p><p> (1)PL/0 語(yǔ)言編譯器</p><p> PL/0語(yǔ)言可看成
5、是PASCAL語(yǔ)言的子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng)。PL/0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語(yǔ)言,與具體計(jì)算機(jī)無(wú)關(guān)。</p><p> PL/0 的編譯程序采用一趟掃描方式,以語(yǔ)法分析程序?yàn)楹诵?,詞法分析程序和代碼生成程序都作為一個(gè)獨(dú)立的過(guò)程,當(dāng)語(yǔ)法分析需要讀單詞時(shí)就用詞法分析程序,而當(dāng)語(yǔ)法分析正確需生成相應(yīng)的目標(biāo)代碼時(shí),則調(diào)用代碼生成程序。此外,用表格管理程序建立變量,常量和過(guò)程標(biāo)識(shí)符的說(shuō)明與引用之
6、間的信息聯(lián)系。用出錯(cuò)處理程序?qū)υ~法和語(yǔ)法分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和錯(cuò)誤性質(zhì)。</p><p> PL/0編譯程序的結(jié)構(gòu)圖</p><p><b> 各功能模塊描述</b></p><p> PL/0編譯程序的總體流程圖</p><p><b> 三、主要成分描述</b><
7、/p><p><b> 1、符號(hào)表</b></p><p> 為了組成一條指令,編譯程序必須知道其操作碼及其參數(shù)(數(shù)或地址)。這些值是由編譯程序本身聯(lián)系到相應(yīng)標(biāo)識(shí)符上去的。這種聯(lián)系是在處理常數(shù)、變量和過(guò)程說(shuō)明完成的。為此,標(biāo)識(shí)符表應(yīng)包含每一標(biāo)識(shí)符所聯(lián)系的屬性;如果標(biāo)識(shí)符被說(shuō)明為常數(shù),其屬性值為常數(shù)值;如果標(biāo)識(shí)符被說(shuō)明成變量,其屬性就是由層次和修正量(偏移量)組成的地址
8、;如果標(biāo)識(shí)符被說(shuō)明為過(guò)程,其屬性就是過(guò)程的入口地址及層次。常數(shù)的值由程序正文提供,編譯的任務(wù)就是確定存放該值的地址。我們選擇順序分配變量和代碼的方法;每遇到一個(gè)變量說(shuō)明,就將數(shù)據(jù)單元的下標(biāo)加一(PL/0 機(jī)中,每個(gè)變量占一個(gè)存貯單元)。開始編譯一個(gè)過(guò)程時(shí),要對(duì)數(shù)據(jù)單元的下標(biāo)dx 賦初值,表示新開辟一個(gè)數(shù)據(jù)區(qū)。dx 的初值為3,因?yàn)槊總€(gè)數(shù)據(jù)區(qū)包含三個(gè)內(nèi)部變量RA,DL 和SL。</p><p> 2、運(yùn)行時(shí)存儲(chǔ)組
9、織和管理</p><p> 對(duì)于源程序的每一個(gè)過(guò)程(包括主程序),在被調(diào)用時(shí),首先在數(shù)據(jù)段中開辟三個(gè)空間,存放靜態(tài)鏈SL、動(dòng)態(tài)鏈DL和返回地址RA。靜態(tài)鏈記錄了定義該過(guò)程的直接外過(guò)程(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址。動(dòng)態(tài)鏈記錄調(diào)用該過(guò)程前正在運(yùn)行的過(guò)程的數(shù)據(jù)段基址。返回地址記錄了調(diào)用該過(guò)程時(shí)程序運(yùn)行的斷點(diǎn)位置。對(duì)于主程序來(lái)說(shuō),SL、DL和RA的值均置為0。靜態(tài)鏈的功能是在一個(gè)子過(guò)程要引用它的直接或間接父過(guò)程
10、(這里的父過(guò)程是按定義過(guò)程時(shí)的嵌套情況來(lái)定的,而不是按執(zhí)行時(shí)的調(diào)用順序定的)的變量時(shí),可以通過(guò)靜態(tài)鏈,跳過(guò)個(gè)數(shù)為層差的數(shù)據(jù)段,找到包含要引用的變量所在的數(shù)據(jù)段基址,然后通過(guò)偏移地址訪問(wèn)它。</p><p> 在過(guò)程返回時(shí),解釋程序通過(guò)返回地址恢復(fù)指令指針的值到調(diào)用前的地址,通過(guò)當(dāng)前段基址恢復(fù)數(shù)據(jù)段分配指針,通過(guò)動(dòng)態(tài)鏈恢復(fù)局部段基址指針。實(shí)現(xiàn)子過(guò)程的返回。對(duì)于主程序來(lái)說(shuō),解釋程序會(huì)遇到返回地址為0的情況,這時(shí)就認(rèn)
11、為程序運(yùn)行結(jié)束。</p><p> 解釋程序過(guò)程中的base函數(shù)的功能,就是用于沿著靜態(tài)鏈,向前查找相差指定層數(shù)的局部數(shù)據(jù)段基址。這在使用sto、lod、stoArr、lodArr等訪問(wèn)局部變量的指令中會(huì)經(jīng)常用。</p><p> 類P-CODE代碼解釋執(zhí)行的部分通過(guò)循環(huán)和簡(jiǎn)單的case判斷不同的指令,做出相應(yīng)的動(dòng)作。當(dāng)遇到主程序中的返回指令時(shí),指令指針會(huì)指到0位置,把這樣一個(gè)條件作為
12、終至循環(huán)的條件,保證程序運(yùn)行可以正常的結(jié)束。</p><p><b> 3、語(yǔ)法分析方法</b></p><p> 語(yǔ)法分析的任務(wù)是識(shí)別由詞法分析給出的單詞符號(hào)序列在結(jié)構(gòu)上是否符合給定的文法規(guī)則.PL/0編譯程序的語(yǔ)法分析采用了自頂向下的遞歸子程序法.粗略地說(shuō):就是對(duì)應(yīng)每個(gè)非終結(jié)符語(yǔ)法單元,編一個(gè)獨(dú)立的處理過(guò)程(或子程序).語(yǔ)法分析研究從讀入第一個(gè)單詞開始由非終結(jié)
13、符程序即開始符出發(fā),沿語(yǔ)法描述圖箭頭所指出的方向進(jìn)行分析.當(dāng)遇到非終結(jié)符時(shí),則調(diào)用相應(yīng)的處理過(guò)程,從語(yǔ)法描述圖看也就進(jìn)入了一個(gè)語(yǔ)法單元,再沿當(dāng)前所進(jìn)入的語(yǔ)法描述圖的箭頭方向進(jìn)行分析,當(dāng)遇到描述圖中是終結(jié)符時(shí),則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語(yǔ)義程序(就是翻譯程序).再讀取下一個(gè)單詞繼續(xù)分析.遇到分支點(diǎn)時(shí)將當(dāng)前的單詞與分支點(diǎn)上的多個(gè)終結(jié)符逐個(gè)相比較,若都不匹配時(shí)可能是進(jìn)入下一非終結(jié)符語(yǔ)法單位或是出錯(cuò).&l
14、t;/p><p> 如果一個(gè)PL/0語(yǔ)言程序的單詞序列在整修語(yǔ)法分析中,都能逐個(gè)得到匹配,直到程序結(jié)束’.’,這時(shí)就說(shuō)所輸入的程序是正確的.對(duì)于正確的語(yǔ)法分析做相應(yīng)的語(yǔ)義翻譯,最終得出目標(biāo)程序。</p><p><b> 4、中間代碼表示</b></p><p> 中間代碼表示格式如下:</p><p> 其中f代表
15、功能碼,L表示層次差,也就是變量或過(guò)程被引用的分程序與說(shuō)明該變量或過(guò)程 的分程序之間的層次差.a的含意對(duì)不同的指令有所區(qū)別,見下面對(duì)每條指令解釋說(shuō)明.</p><p><b> 四、測(cè)試用例</b></p><p> 增加 注釋; 注釋由/和/包含;</p><p> 2.賦值運(yùn)算: *=,/=</p><p>&
16、lt;b> 代碼如下:</b></p><p><b> var x,y;</b></p><p><b> begin</b></p><p><b> x:=5;</b></p><p><b> y:=10;</b><
17、;/p><p><b> x*=y;</b></p><p><b> y/=x;</b></p><p><b> write(x);</b></p><p><b> write(y);</b></p><p><b&
18、gt; End.</b></p><p><b> 運(yùn)行結(jié)果:</b></p><p><b> 開發(fā)過(guò)程</b></p><p><b> .h</b></p><p> # define norw 19 /*關(guān)鍵字個(gè)數(shù)*
19、/ //關(guān)鍵字個(gè)數(shù)數(shù)由初始值13增加至19</p><p> # define txmax 100 /*名字表容量*/</p><p> # define nmax 14 /*number的最大位數(shù)*/</p><p> # define al 10 /*符號(hào)的最大
20、長(zhǎng)度*/</p><p> # define amax 2047 /*地址上界*/</p><p> # define levmax 3 /*最大允許過(guò)程嵌套聲明層數(shù)[0,lexmax]*/</p><p> # define cxmax 200 /*最多的虛擬機(jī)代碼數(shù)*/&
21、lt;/p><p><b> /*符號(hào)*/</b></p><p> //運(yùn)算符 *=,/=</p><p> enum symbol{</p><p> nul, ident, number, plus, minus,</p><p> times, sl
22、ash, oddsym, eql, neq,</p><p> lss, leq, gtr, geq, lparen,</p><p> rparen, comma, semicolon,period, becomes,</p><p> beginsym, endsym, ifsym, then
23、sym, whilesym,</p><p> writesym, readsym, dosym, callsym, constsym,</p><p> varsym, procsym, timeseql, slasheql</p><p><b> };</b></p><p> #define s
24、ymnum 42 //符號(hào)數(shù)初始值由32增加至42</p><p><b> .cpp</b></p><p> strcpy(&(word[0][0]),"begin");</p><p> strcpy(&(word[1][0]),"call");</p>&
25、lt;p> strcpy(&(word[3][0]),"const");</p><p> strcpy(&(word[4][0]),"do");</p><p> strcpy(&(word[7][0]),"end");</p><p> strcpy(&(w
26、ord[9][0]),"if");</p><p> strcpy(&(word[10][0]),"odd");</p><p> strcpy(&(word[11][0]),"procedure");</p><p> strcpy(&(word[12][0]),"
27、read");</p><p> strcpy(&(word[14][0]),"then");</p><p> strcpy(&(word[16][0]),"var");</p><p> strcpy(&(word[17][0]),"while");</p&
28、gt;<p> strcpy(&(word[18][0]),"write");</p><p> /*設(shè)置保留字符號(hào)*/</p><p> wsym[0]=beginsym;</p><p> wsym[1]=callsym;</p><p> wsym[3]=constsym;</p
29、><p> wsym[4]=dosym;</p><p> wsym[7]=endsym;</p><p> wsym[9]=ifsym;</p><p> wsym[10]=oddsym;</p><p> wsym[11]=procsym;</p><p> wsym[12]=rea
30、dsym;</p><p> wsym[14]=thensym;</p><p> wsym[16]=varsym;</p><p> wsym[17]=whilesym;</p><p> wsym[18]=writesym;</p><p> 擴(kuò)充賦值運(yùn)算*=和/=</p><p>
31、; 在int statement(bool* fsys,int * ptx,int lev)中增加: else if(sym==timeseql) // *=運(yùn)算 </p><p><b> {</b></p><p><b
32、> getsymdo;</b></p><p> memcpy(nxtlev,fsys,sizeof(bool)* symnum);</p><p> gendo(lod,lev-table[i].level,table[i].adr);</p><p> expressiondo(nxtlev,ptx,lev);</p>&
33、lt;p><b> if(i!=0)</b></p><p><b> {</b></p><p> gendo(opr,0,4);</p><p> gendo(sto,lev-table[i].level,table[i].adr);</p><p><b> }<
34、;/b></p><p><b> }</b></p><p> else if(sym==slasheql) // /=運(yùn)算 </p><p><b> {</b></p><p><b> getsymdo;</b></p><p>
35、 memcpy(nxtlev,fsys,sizeof(bool)* symnum);</p><p> gendo(lod,lev-table[i].level,table[i].adr);</p><p> expressiondo(nxtlev,ptx,lev);</p><p><b> if(i!=0)</b></p>
36、<p><b> {</b></p><p> gendo(opr,0,5);</p><p> gendo(sto,lev-table[i].level,table[i].adr);</p><p><b> }</b></p><p><b> }</b&
37、gt;</p><p><b> 完成情況</b></p><p> 1、增加 注釋; 注釋由/和/包含</p><p> 2、*=,/=兩種賦值運(yùn)算</p><p><b> 七、總結(jié)</b></p><p> 1、PL0代碼的框架有很大的局限性,用它來(lái)擴(kuò)展高級(jí)語(yǔ)
38、言的某些語(yǔ)句的完整功能很麻煩,就例如各種基本類型之間的轉(zhuǎn)換,一個(gè)棧貌似不能精確地達(dá)到目標(biāo),多個(gè)不同數(shù)據(jù)類型的棧在PL0結(jié)構(gòu)中又不能很好地轉(zhuǎn)換類型,多種數(shù)據(jù)類型間運(yùn)算很不方便。</p><p> 2、在答辯的過(guò)程中,老師提問(wèn)了以下幾個(gè)問(wèn)題:</p><p> ?。?)在擴(kuò)充賦值運(yùn)算*=、/=時(shí),一共用了幾個(gè)測(cè)試用例?</p><p> 一共用了1個(gè)測(cè)試用例。<
39、;/p><p> ?。?)在擴(kuò)充賦值運(yùn)算*=、/=時(shí),分別在源代碼哪些地方進(jìn)行了擴(kuò)充?</p><p> 本次擴(kuò)充是在statement函數(shù)中進(jìn)行擴(kuò)充,還在頭文件的enum symbol中增加了timeseql, slasheql。</p><p> 3、通過(guò)這個(gè)編譯原理PL/0編譯器的擴(kuò)充,終于可以把課本的理論知識(shí)與實(shí)際問(wèn)題結(jié)合起來(lái)。一開始由于對(duì)編譯原理的掌握還不
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)報(bào)告--pl0編譯器的擴(kuò)充
- 編譯原理課程設(shè)計(jì)---pl0編輯器擴(kuò)充
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)-- pl0語(yǔ)言的擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--對(duì)pl0進(jìn)行擴(kuò)充和修改
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- c語(yǔ)言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--對(duì)pl0進(jìn)行擴(kuò)充和修改
- 編譯原理課程設(shè)計(jì)____c語(yǔ)言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語(yǔ)言編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--對(duì)PL0進(jìn)行擴(kuò)充和修改.doc
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---簡(jiǎn)單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程的設(shè)計(jì)--c語(yǔ)言編譯器
- pl0擴(kuò)展編譯器_設(shè)計(jì)文檔
- 編譯原理課程設(shè)計(jì)報(bào)告(一個(gè)完整的編譯器)
評(píng)論
0/150
提交評(píng)論