版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、實(shí)驗(yàn)?zāi)康脑诜治隼斫庖粋€(gè)教學(xué)型編譯程序(如PL/0)的基礎(chǔ)上,對(duì)其詞法分析程序、語(yǔ)法分析程序和語(yǔ)義處理程序進(jìn)行部分修改擴(kuò)充。達(dá)到進(jìn)一步了解程序編譯過程的基本原理和基本實(shí)現(xiàn)方法的目的。二、實(shí)驗(yàn)成要求1. 課內(nèi)實(shí)驗(yàn)對(duì)PL/0作以下修改擴(kuò)充:(1)增加單詞:保留字 ELSE,F(xiàn)OR,TO,DOWNTO,RETURN運(yùn)算符 +=,-=,+,-(2)修改單詞:不等號(hào)# 改為 (3)增加條件語(yǔ)句的ELSE子句2. 課程設(shè)計(jì)基本內(nèi)容(成績(jī)范圍:“中”、“及格”或“不及格”)(1)擴(kuò)充賦值運(yùn)算:+= 和 -=(2)擴(kuò)充語(yǔ)句(Pascal的FOR語(yǔ)句):FOR := TO DO FOR := DOWNTO D
2、O 其中,語(yǔ)句的循環(huán)變量的步長(zhǎng)為1,語(yǔ)句的循環(huán)變量的步長(zhǎng)為-1。選做內(nèi)容(成績(jī)?cè)u(píng)定范圍擴(kuò)大到:“優(yōu)”和“良”)(1)增加運(yùn)算:+ 和 -。;(2)增加類型: 字符類型; 實(shí)數(shù)類型。(3)擴(kuò)充函數(shù): 有返回值和返回語(yǔ)句; 有參數(shù)函數(shù)。(4)增加一維數(shù)組類型(可增加指令)。(5)其他典型語(yǔ)言設(shè)施。三、實(shí)驗(yàn)環(huán)境(1)實(shí)現(xiàn)平臺(tái):WindowsXP, Visual studio 2005(2)教學(xué)型編譯程序:PL/0 (C語(yǔ)言版)四、設(shè)計(jì)方案Error()出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼GetCh()漏掉空格,讀取一個(gè)字符GetSym() 詞法分析,讀取一個(gè)單詞 GEN()目標(biāo)代碼生成過程,本過程用于把
3、生成的目標(biāo)代碼寫入目標(biāo)代碼數(shù)組,供后面的解釋器解釋執(zhí)行TEST() 測(cè)試當(dāng)前單詞是否合法過程testENTER()登陸符號(hào)表過程enterPOSITION()在符號(hào)表中查找指定符號(hào)所在位置的函數(shù)position,如果找不到就返回0VARDECLARATION()變量聲明LISTCODE()列出目標(biāo)代碼清單;FACTOR() 因子處理過程factorTERM() 項(xiàng)處理過程term; EXPRESSION()表達(dá)式處理過程CONDITION() 條件處理過程STATEMENT()語(yǔ)句處理過程BLOCK() 語(yǔ)法分析過程 BASE() 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)基地址的函數(shù),INTERPRET ()對(duì)目
4、標(biāo)代碼解釋運(yùn)行過程啟動(dòng)置初值調(diào)用getsym取單詞調(diào)用block過程是否為源程序結(jié)束符源程序是否有錯(cuò)誤調(diào)用解釋過程interpret解釋執(zhí)行目標(biāo)執(zhí)行目標(biāo)程序結(jié)束出錯(cuò)打印錯(cuò)誤NNYY程序分程序語(yǔ)句條件表達(dá)式項(xiàng)因子PL/0語(yǔ)法調(diào)用關(guān)系圖五、主要成分描述1 符號(hào)表在編譯程序中符號(hào)表用來存放語(yǔ)言程序中出現(xiàn)的有關(guān)標(biāo)識(shí)符的屬性信息,符號(hào)表中所登記的信息在編譯的不同階段都要用到。在語(yǔ)義分析中,符號(hào)表所登記的內(nèi)容將用于語(yǔ)義檢查(如檢查一個(gè)名字的使用和原先的說明是否一致)和產(chǎn)生中間代碼。在目標(biāo)代碼生成階段,當(dāng)對(duì)符號(hào)名進(jìn)行地址分配時(shí),符號(hào)表是地址分配的依據(jù)。對(duì)一個(gè)多遍掃描的編譯程序,不同遍所用的符號(hào)表也往往各有不
5、同。因?yàn)槊勘樗P(guān)心的信息各有差異。一張符號(hào)表的每一項(xiàng)(或稱入口才包含兩大欄(或稱區(qū)段、字域),即名字欄(NAME) 信息欄(INFORMATION) 信息欄包含許多子欄和標(biāo)志位,用來記錄相應(yīng)名字和種種不同屬性,由于查填符號(hào)表一般是通過匹配名字來寮現(xiàn)的,因此,名字欄也稱主欄。主欄的內(nèi)容稱為關(guān)鍵字(key word)。2運(yùn)行時(shí)存儲(chǔ)組織和管理由于編譯時(shí)目標(biāo)程序運(yùn)行的數(shù)據(jù)空間大小已經(jīng)規(guī)定,所以存儲(chǔ)組織屬于靜態(tài)存儲(chǔ)。源程序的標(biāo)識(shí)符存放在TABLE表中,目標(biāo)代碼存放在CODE中,S是由解釋程序定義的一維整型數(shù)組,是程序運(yùn)行時(shí)的數(shù)據(jù)存儲(chǔ)空間。解釋程序還定義了4個(gè)寄存器:1)P:程序地址寄存器:指向下一條要執(zhí)
6、行的目標(biāo)程序的地址(相當(dāng)目標(biāo)程序CODE數(shù)組的下標(biāo))。2)I:指令寄存器:存放著當(dāng)前正在解釋的下一條目標(biāo)指令。3)T:棧頂寄存器:由于每個(gè)過程當(dāng)它被運(yùn)行時(shí),給它分配的數(shù)據(jù)空間(下邊稱數(shù)據(jù)段)包括靜態(tài)部分和動(dòng)態(tài)部分,對(duì)于動(dòng)態(tài)部分,要注意的是,棧頂寄存器指出了當(dāng)前棧中最新分配的單元。4)B:基址寄存器:指向每個(gè)過程被調(diào)用時(shí),在數(shù)據(jù)區(qū)S中給它分配的數(shù)據(jù)段的起始地址,也稱基地址3. 中間代碼表示對(duì)PL/0編譯程序的目標(biāo)代碼的指令格式描述如下: f l a其中f代表功能碼,l表示層次差,a的含意對(duì)不同的指令有所區(qū)別,見下面對(duì)每條指令的解釋說明:lit 0 a將常數(shù)值取到棧頂,a為常數(shù)值Lod l a將變
7、量值取到棧頂,a為偏移量,l為層差Sto l a將棧頂內(nèi)容送入某變量單元中,a為偏移量,l為層差Cal l a調(diào)用過程,a為過程地址,l為層差I(lǐng)nt 0 a在運(yùn)行棧中為被調(diào)用的過程開辟a個(gè)單元的數(shù)據(jù)區(qū)jmp 0 a無條件跳轉(zhuǎn)至a地址Jpc 0 a條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真則跳轉(zhuǎn)至a地址,否則順序執(zhí)行opr 0 0過程調(diào)用結(jié)束后,返回調(diào)用點(diǎn)并退棧opr 0 1棧頂元素取反opr 0 2次棧頂與棧頂相加,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 3次棧頂減去棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 4次棧頂乘以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 5次棧頂除以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0
8、 6棧頂元素的奇偶判斷,結(jié)果值在棧頂opr 0 7opr 0 8次棧頂與棧頂是否相等,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 9次棧頂與棧頂是否不等,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 10次棧頂是否小于棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 11次棧頂是否大于等于棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 12次棧頂是否大于棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 13次棧頂是否小于等于棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧opr 0 14棧頂值輸出至屏幕opr 0 15屏幕輸出換行opr 0 16從命令行讀入一個(gè)輸入置于棧頂4. 語(yǔ)法分析方法自頂向下的語(yǔ)法分析: . VAR ; A BEGIN END
9、 READ ( ) A六、測(cè)試用例var a,b,c,d; 結(jié)果:輸入3beginread(a); b:=a;c:=b-;d:=(b+2)/+c;if a=3 then begin /a=3 write(a); /b=2 write(b); /c=4 write(c); /d=1 write(d); end else結(jié)果:輸入1/test begin/百慕大 c:=4; c+=-4; for a:=1 to 100 do c+; write(c); a-=1; write(a); endend. /test七、開發(fā)過程和完成情況1)增加保留字 ELSE,F(xiàn)OR,TO, DOWN, RETURN
10、.增加運(yùn)算符 +=,-=,+,-首先, 在pl0.h中添加保留字(黑體字部分)enum symbol /此處需要修改nul,ident,number,plus,minus,times,slash, oddsym,eql, neq,lss,leq, gtr,geq, lparen,rparen,comma, semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,elsesym,forsym,tosym,downto
11、sym,returnsym,plusplus,minusminus,plusequal,minusequal,;#define symnum 41 /改為相應(yīng)的個(gè)數(shù)然后: 由于是二分查找,在如下位置按順序排關(guān)鍵字/*設(shè)置保留字名字,按照字母順序,便于折半查找*/strcpy(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),const);strcpy(&(word30),do);strcpy(&(word40),downto);strcpy(&(word50),else);strcpy(&(word60),end);strcpy(
12、&(word70),for);strcpy(&(word80),if);strcpy(&(word90),odd);strcpy(&(word100),procedure);strcpy(&(word110),read);strcpy(&(word120),return);strcpy(&(word130),then);strcpy(&(word140),to);strcpy(&(word150),var);strcpy(&(word160),while);strcpy(&(word170),write);/*設(shè)置保留字符號(hào)*/wsym0=beginsym;wsym1=callsym; wsy
13、m2=constsym;wsym3=dosym;wsym4=downtosym;wsym5=elsesym; wsym6=endsym; wsym7=forsym;wsym8=ifsym; wsym9=oddsym; wsym10=procsym;wsym11=readsym;wsym12=returnsym;wsym13=thensym;wsym14=tosym; wsym15=varsym;wsym16=whilesym;wsym17=writesym;2) 修改單詞:不等號(hào)# 改為 首先, 將這句 ssym#=neq; 刪除然后,在getsym()函數(shù)中,把分析到的定義為不等號(hào)if(ch
14、=)sym=neq;getchdo;else sym=lss;3)增加條件語(yǔ)句的ELSE子句在statement函數(shù)中改為if(sym=ifsym) /*準(zhǔn)備按照if語(yǔ)句處理*/getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevthensym=true;nxtlevdosym=true; /*后跟符號(hào)為then或do*/conditiondo(nxtlev,ptx,lev); /*調(diào)用條件處理(邏輯運(yùn)算)函數(shù)*/if(sym=thensym)getsymdo;elseerror(16); /*缺少then*/cx1=cx; /*保存當(dāng)
15、前指令地址*/gendo(jpc,0,0); /*生成條件跳轉(zhuǎn)指令,跳轉(zhuǎn)地址暫寫*/statementdo(fsys,ptx,lev); /*處理then后的語(yǔ)句*/add keyword elseif(sym=elsesym)getsymdo;int cx2=cx;gendo(jmp,0,0);codecx1.a=cx;statementdo(fsys,ptx,lev);codecx2.a=cx;elsecodecx1.a=cx; /*經(jīng)statement處理后,cx為then后語(yǔ)句執(zhí)行 完的位置,它正是前面未定的跳轉(zhuǎn)地址*/4)添加+, -,+=, -=首先,在getsym函數(shù)中添加if(
16、ch=+)/plusplus pluseqalgetchdo;if(ch=+)sym=plusplus;getchdo;else if(ch=)sym=plusequal;getchdo;elsesym=plus;else if(ch=-)/minusminus minusequalgetchdo;if(ch=-)sym=minusminus;getchdo;else if(ch=)sym=minusequal;getchdo;然后,在statement函數(shù)中,修改switch(sym) case becomes:getsymdo;expressiondo(nxtlev,ptx,lev);br
17、eak;/+case plusplus:getsymdo;gendo(lit,0,1);gendo(opr,0,2);break;/+=case plusequal:getsymdo;expressiondo(nxtlev,ptx,lev);gendo(opr,0,2);break;/-case minusminus:getsymdo;gendo(lit,0,1);gendo(opr,0,3);break;/-=case minusequal:getsymdo;expressiondo(nxtlev,ptx,lev);gendo(opr,0,3);break;default: error(13
18、);再次,由于+,-運(yùn)算要用到在表達(dá)式處理中,而且又有前加,前減,后加后減之類的,所以因子函數(shù)factor中也要有相應(yīng)的處理。switch(tablei.kind)case constant: /*名字為常量*/gendo(lit,0,tablei.val); /*直接把常量的值入棧*/break;case variable: /*名字為變量*/gendo(lod,lev-tablei.level,tablei.adr); /*找到變量地址并將其值入棧*/加加減減if(forhead)gen(lit,0,1);if(temp=plusplus)gen(opr,0,2);else gen(opr
19、,0,3);gen(sto,lev-tablei.level,tablei.adr);gen(lod,lev-tablei.level,tablei.adr);forhead=false;end=true;elseforhead=true;break;case procedur: /*名字為過程*/error(21); /*不能為過程*/break;/增加加加與減減運(yùn)算(后加后減)if(sym=plusplus|sym=minusminus)if(end) error(2000);if(forhead)gen(lit,0,1);if(sym=plusplus)gen(opr,0,2);else
20、 gen(opr,0,3);gen(sto,lev-tablei.level,tablei.adr);gen(lod,lev-tablei.level,tablei.adr);gen(lit,0,1);if(sym=plusplus) gen(opr,0,3);else gen(opr,0,2);end=false;getsym();elsetemp=sym;forhead=true;getsym();5) 添加for語(yǔ)句在statement函數(shù)中修改if(sym=forsym)getsymdo;if(sym=ident)i=position(id, *ptx);if(i=0) error(1
21、1);/變量沒有說明elseif(tablei.kind!=variable) error(1000);getsym();if(sym!=becomes) error(1000);elsegetsym();expression(nxtlev,ptx,lev);if(sym=tosym|sym=downtosym)symbol tmp=sym;cx1=cx;gen(sto,lev-tablei.level,tablei.adr);gen(lod,lev-tablei.level,tablei.adr);getsym();expression(nxtlev,ptx,lev);if(tmp=tosy
22、m)gen(opr,0,13);else gen(opr,0,11);cx2=cx;gen(jpc,0,0);if(sym=dosym)getsym();statement(fsys,ptx,lev);gen(lod,lev-tablei.level,tablei.adr);gen(lit,0,1);if(tmp=tosym)gen(opr,0,2);else gen(opr,0,3);gen(jmp,0,cx1);codecx2.a=cx;else error(1000);else error(1000);else error(1000);6)添加單行注釋對(duì)于單行注釋,在getch函數(shù)中,將以/開頭的文字去掉即可以實(shí)現(xiàn)單行
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年上半年寧夏中小學(xué)教師資格考試(筆試)備考題庫(kù)附答案(培優(yōu)a卷)
- 2026湖南省第二工程有限公司招聘6人參考考試試題及答案解析
- 初中語(yǔ)文:城市老舊小區(qū)改造項(xiàng)目中的文化傳承與創(chuàng)新策略研究教學(xué)研究課題報(bào)告
- 2026貴陽(yáng)觀山湖人力資源服務(wù)有限公司招聘筆試參考題庫(kù)及答案解析
- 2024年上海師范大學(xué)單招職業(yè)適應(yīng)性測(cè)試模擬測(cè)試卷附答案解析
- 2024年無錫科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試模擬測(cè)試卷附答案解析
- 2025年哈爾濱工程大學(xué)輔導(dǎo)員招聘?jìng)淇碱}庫(kù)附答案
- 2025年黑龍江農(nóng)業(yè)經(jīng)濟(jì)職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)附答案
- 2024年汕頭市市直機(jī)關(guān)遴選考試真題
- 提升急性患者心理舒適度的方法
- 《設(shè)備故障診斷與維修》課件-項(xiàng)目二 設(shè)備故障診斷
- 酒店安全巡檢管理辦法
- ZLP630高處作業(yè)吊籃使用說明書
- 2025至2030年中國(guó)羥基酪醇行業(yè)全景調(diào)研及競(jìng)爭(zhēng)格局預(yù)測(cè)報(bào)告
- T/CECS 10348-2023一體化凈水設(shè)備
- 硫酸銨采購(gòu)合同協(xié)議
- 湖南儲(chǔ)備糧代儲(chǔ)合同
- 2024-2025學(xué)年遼寧省大連市甘井子區(qū)第八十中學(xué)上學(xué)期七年級(jí)數(shù)學(xué)期末模擬試卷
- A80685-1.01-A80580-1.01-嘉樂泉煤礦安全生產(chǎn)事故隱患排查治理考核方案
- 2025年12月保安公司年終工作總結(jié)模版(三篇)
- 微生物發(fā)酵技術(shù)在農(nóng)產(chǎn)品加工中的應(yīng)用-洞察分析
評(píng)論
0/150
提交評(píng)論