版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、編譯原理課程設(shè)計(jì)題目:pl/0編譯程序的改進(jìn)與完善學(xué)生所在學(xué)院:信息科學(xué)與工程學(xué)院學(xué)生所在班級: 06級計(jì)算機(jī)軟件1班學(xué) 生 姓 名 : 學(xué) 生 學(xué) 號 : 指 導(dǎo) 教 師 : 張世輝 一、課設(shè)目的:1. 閱讀、研究、改進(jìn)、設(shè)計(jì)和調(diào)試一個(gè)簡單的編譯程序;2. 加深對編譯程序理論和編譯過程的理解。二、課設(shè)內(nèi)容:1 擴(kuò)充語句for(;);2 擴(kuò)充語句if then else ;3 擴(kuò)充語句repeat ;until ;4 增加自增自減運(yùn)算+和和+=,-=運(yùn)算;5 修改不等號#,為!=;6 增加一維數(shù)組聲明格式:/:/;賦值格式::=;調(diào)用格式:三、程序結(jié)構(gòu):程序pl0程序block語句statem
2、ent條件condition表達(dá)式expression項(xiàng)term因子factorPL/0源程序 詞法分析程序表格管理程序語法分析程序出錯(cuò)管理程序代碼生成程序目標(biāo)程序圖1 編譯程序結(jié)構(gòu) 圖2功能模塊調(diào)用1.各功能模塊的作用:Pl0.c:主程序Error:出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼Getsym:詞法分析,讀取一個(gè)單詞Getch:漏掉空格,讀取一個(gè)字符Gen:生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)Test:測試當(dāng)前當(dāng)前符號是否合法Block:分程序分析處理過程,詞法語法分析Enter:登陸名字表Position:查找標(biāo)識符在名字表中的位置Constdeclaration:常量定義處理Vardeclar
3、action:變量說明處理Listcode:列出目標(biāo)代碼清單Statement:語句處理Expression:表達(dá)式處理Term:項(xiàng)處理Factor:因子處理Condition:條件處理Interpret:對目標(biāo)代碼的解釋執(zhí)行程序Base:通過靜態(tài)鏈求出數(shù)據(jù)取得基地址增加兩個(gè)功能:Arraydeclaration:數(shù)組聲明處理Arraycoef:數(shù)組索引計(jì)算和“虛擬機(jī)”動作生成2.保留字:enum symbol nul,ident,number,plus,minus, times,slash,oddsym,eql,neq, lss,leq,gtr,geq,lparen, rparen,comm
4、a,semicolon,period,becomes, beginsym,endsym,ifsym,thensym,elsesym,forsym, inc,dec,whilesym, writesym, readsym,dosym,callsym, constsym,varsym, procsym,repeatsym, untilsym, plusbk,minusbk, lbrack,rbrack,colon,共43個(gè),其中補(bǔ)充保留字為:else, for, repeat, until, plusbk, minusbk, Lbrack, rbrack, colon3.虛擬機(jī)代碼enum fct
5、 lit, opr, lod, sto, cal, inte, jmp, jpc,lda, sta, 共10個(gè),補(bǔ)充的lda,sta用于數(shù)組操作4.名字表中的類型enum object constant, variable, procedure, arrays, 共4個(gè),擴(kuò)充arrays,以便實(shí)現(xiàn)數(shù)組5.名字表結(jié)構(gòu)struct tablestructchar nameal;enum object kind;int val;int level;int adr;int size;/擴(kuò)充名字表結(jié)構(gòu),增加一個(gè)data域保存數(shù)組的下界int data; /* 其他數(shù)據(jù),對arrays來說是下界*/6.錯(cuò)
6、誤信息表(1) 常數(shù)說明中的=寫成了:=(2) 常數(shù)說明中的=后應(yīng)是數(shù)字(3)常數(shù)說明中的標(biāo)識符后應(yīng)是=(4) const,var,procedure后應(yīng)為標(biāo)識符(5)漏掉了,或;(6)過程說明后的符號不正確(應(yīng)是語句開始符,或過程定義符)(7)應(yīng)是語句開始符(8)程序體內(nèi)語句部分的后跟符不正確(9)程序結(jié)尾丟了句號。(10)語句之間漏了;(11)標(biāo)識符未說明(12)賦值語句中,賦值號左部標(biāo)識符屬性應(yīng)是變量(13)賦值號左部標(biāo)識符屬性應(yīng)是賦值號(14)call后應(yīng)為標(biāo)識符(15)call后標(biāo)識符屬性應(yīng)為過程(16)條件語句中丟了then(17)丟了end或;(18)while循環(huán)語句中丟了do
7、(19)語句后的符號不正確(20)應(yīng)為關(guān)系運(yùn)算符(21)表達(dá)式內(nèi)標(biāo)識符屬性不能是過程(22)表達(dá)式中漏掉右括號)(23)因子后的非法符號(24)表達(dá)式的開始符不能使此符號(31)數(shù)越界(32)read語句括號中的標(biāo)識符不是變量補(bǔ)充錯(cuò)誤處理:(50)數(shù)組格式錯(cuò)誤(51)數(shù)組訪問錯(cuò)誤7.語法描述圖:程序分程序 .圖3 程序語法描述圖,。;,;=語句constidentnumbervaridentprocedureident分程序圖4 分程序語法描述圖語句語句until表達(dá)式表達(dá)式:=if條件endthen語句條件do語句(表達(dá)式),(ident,)begin語句語句;identcallidentw
8、hilerepeatreadwritedecsincsincsdecselse語句for條件語句圖5 語句語法描述圖 條件=#=odd表達(dá)式表達(dá)式=圖6條件語法描述圖表達(dá)式項(xiàng)項(xiàng)+ 圖7 表達(dá)式語法描述圖項(xiàng)因子因子/*%圖8 項(xiàng)語法描述圖因子)(表達(dá)式identnumberincsdecsdecsincs圖9 因子語法描述圖四、功能擴(kuò)充1.在語句處理中增加repeat-until語句if(sym = repeatsym)cx1 = cx;getsymdo;statementdo(nxtlev, ptx, lev);if(sym = untilsym)getsymdo;conditiondo(nx
9、tlev, ptx, lev);cx2=cx;gendo(jpc, 0, 0);codecx2.a=cx1; else error(33); /沒有寫until出錯(cuò)注意:repeat是可以作為語句的開始符,所有要在初始化函數(shù)中的語句開始符中添加statbegsysrepeatsym=true;語句。2.語句處理中加入for循環(huán)語句if(sym = forsym)getsymdo;if(sym != lparen) error(34);/沒有左括號出錯(cuò)else getsymdo;statementdo(nxtlev, ptx, lev); /S1代碼if(sym != semicolon) er
10、ror(10); /語句缺少分號出錯(cuò)elsecx1=cx;getsymdo;conditiondo(nxtlev, ptx, lev); /E代碼if(sym!=semicolon)error(10);/語句缺少分號出錯(cuò)else cx2=cx;gendo(jpc,0,0);cx3=cx;gendo(jmp,0,0);getsymdo;cx4=cx;statementdo(nxtlev, ptx, lev);/S2代碼if(sym != rparen) error(22);/缺少右括號出錯(cuò)else gendo(jmp,0,cx1);getsymdo;cx5=cx;statementdo(nxtl
11、ev, ptx, lev); /S3代碼codecx3.a=cx5;gendo(jmp,0,cx4);codecx2.a=cx;3.語句處理中加入if-then-else語句在原有程序if(sym=then).后加入下列代碼:cx1 = cx;gendo(jpc, 0, 0);statementdo(fsys, ptx, lev);if(sym = elsesym)getsymdo;cx2 = cx;gendo(jmp, 0, 0);codecx1.a = cx;statementdo(fsys, ptx, lev);codecx2.a = cx;elsecodecx1.a = cx;4.擴(kuò)充
12、+和運(yùn)算符對于+和-運(yùn)算符,擴(kuò)充時(shí)要注意存在兩個(gè)情況:1)作為語句的時(shí)候;2)作為表達(dá)式中的因子的時(shí)候。 注意:擴(kuò)充時(shí)增加因子開始符facbegsysincs=true和facbegsysdecs=true。 擴(kuò)充的語法描述見結(jié)構(gòu)設(shè)計(jì)中的PL/0分程序和主要語句的語法描述中的描述圖,詳細(xì)代碼見程序。 1)作為語句的時(shí)候,有四種情況: a+; a-; +a; -a; 文法的EBNF表示形式為: :=+ |-|+|- 文法分析過程大體如下圖: 語句開始符SYM=+或者-讀下個(gè)SYM,如是ident,確定為自增自減語句語句開始符SYM=ident讀下個(gè)SYM,如是+或者-,確定為自增自減語句 +a和
13、a a+和a生成中間代碼對于a+;+a;和a-;-a;語句的處理如下: 先將變量的值取出放在棧頂,后將1入棧,后執(zhí)行加法或減法運(yùn)算oprv指令的2(加法)、3(減法),后將運(yùn)算后的棧頂值存回變量。 a+;和+a;語句的中間代碼:lod 0 3;lit 0 1;opr 0 2;sto 0 3;a-;和-a;語句的中間代碼:lod 0 3;lit 0 1;opr 0 3;sto 0 3; 2)作為因子的時(shí)候,有兩種情況: a+和a-作為因子,比如:b:=a+*a-;語句 +a和-a作為因子,比如:b:=-a+2*+a;語句 文法的EBNF表示形式為: :=. +|-|+| -. 其中的.表示前后都
14、可以有其他的項(xiàng)或因子 生成中間代碼對于因子+a和-a的中間代碼生成處理和a+;等語句處理一樣; 對于因子a+和a的中間代碼生成處理如下:a+:lod 0 3;lit 0 1;opr 0 2;sto 0 3;lod 0 3;lit 0 1;opr 0 3; a-:lod 0 3;lit 0 1;opr 0 3;sto 0 3;lod 0 3;lit 0 1;opr 0 2; 先將變量的值取出放在棧頂,后將1入棧,后執(zhí)行加法或減法運(yùn)算opr指令的2(加法)、3(減法),后將運(yùn)算后的棧頂值存回變量,后將變量的值又取出來放入棧頂,后將1入棧,如果是a+就執(zhí)行減法,如果是a就執(zhí)行加法,以實(shí)現(xiàn)先用a的值后
15、再加1。5.修改不等號#為!=注釋源程序中的ssym# = neq語句,在getsym中加入下列代碼:/修改不等號為!=else if(ch=!)getchdo;if(ch=)sym=neq;getchdo; else sym=nul; 6.加入對一維數(shù)組的支持本程序?qū)?shù)組看做變量的一種,由var聲明函數(shù)調(diào)用array聲明函數(shù)完成數(shù)組聲明,這樣就處加入文件輸出的相關(guān)語句外,可以完全保留block函數(shù)和enter函數(shù);通過改寫factor函數(shù)使數(shù)組因子包括了后綴的索引號,這樣就可以調(diào)用通用的表達(dá)式函數(shù)賦值數(shù)組了。為了方便完成數(shù)組相關(guān)功能,擴(kuò)充了虛擬機(jī)處理代碼。數(shù)組的越界及非法調(diào)用錯(cuò)誤處理沒有完善
16、,僅給出了錯(cuò)誤代碼。在頭文件pl0.h中:/*定義兩個(gè)全局變量,用來保存數(shù)組定義的下界和容量*/static int g_arrBase = 0;static int g_arrSize = 0;/* 虛擬機(jī)代碼*/增加lda,sta專門由于數(shù)組的處理/增加兩個(gè)虛擬機(jī)指令lda,sta,分別用來從數(shù)組中取數(shù)和存到數(shù)組中/數(shù)組元素的訪問和存儲,是將()后的當(dāng)成表達(dá)式,先處理,得到元素的索引,放在棧頂/最后根據(jù)數(shù)組的首地址,得到某個(gè)元素的地址enum fct .lda, sta /擴(kuò)充名字表結(jié)構(gòu),增加一個(gè)data域保存數(shù)組的下界struct data; /* 其他數(shù)
17、據(jù),對arrays來說是下界*/* 名字表中的類型*/enum object .arrays /添加數(shù)組類型/數(shù)組聲明處理, 下界和上界允許已經(jīng)定義過的常量標(biāo)識符int arraydeclaration(int* ptx, int lev, int* pdx);/數(shù)組元素索引計(jì)算與“虛擬機(jī)”生成int arraycoef(bool *fsys,int *ptx,int lev);在源程序文件pl0.c中:編寫相關(guān)的arraydeclaration,arraycoef兩個(gè)功能函數(shù):/* 數(shù)組聲明處理, 下界和上界允許已經(jīng)定義過的常量標(biāo)識符*/int arraydeclaration(int* p
18、tx, int lev, int* pdx) char arrIdal; /* 暫存數(shù)組標(biāo)識名,避免被覆蓋*/ int cstId; /* 常量標(biāo)識符的位置*/ int arrBase=-1, arrTop=-1; /* 數(shù)組下界、上界的數(shù)值*/getsymdo; if(sym=lbrack) /* 標(biāo)識符之后是,則識別為數(shù)組*/ strcpy(arrId, id); /* 檢查下界*/ getsymdo; if(sym=ident) if(cstId=position(id,(*ptx)!=0)arrBase=(constant=tablecstId.kind)?tablecstId.val
19、:-1; elsearrBase=(sym=number)?num:-1; if(-1=arrBase)error(50);return -1; /* 檢查冒號*/getsymdo;if(sym!=colon) error(50);return -1; /* 檢查上界*/ getsymdo; if(sym=ident) if(cstId=position(id,(*ptx)!=0)arrTop=(constant=tablecstId.kind)?tablecstId.val:-1; elsearrTop=(number=sym)?num:-1; if(arrTop=-1)error(50);/隨意指定,因?yàn)樵绦驅(qū)﹀e(cuò)誤號的規(guī)劃極差!return -1; /* 檢查 */ getsymdo; if(sym!=rbrack) error(50);return -1; /* 上下界是否符合條件檢查*/ g_arrSize=arrTop-arrBase+1; g_arrBase=arrBase; if(g_arrSizen; write(a); write(b);end.當(dāng)輸入的n為3時(shí),repeat.until.語句中的循環(huán)體執(zhí)行3次,所以a=4,b=72.測試增加的+,-功能 測試文件:2.txt 測試結(jié)果:var a,b;begin
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州財(cái)經(jīng)職業(yè)學(xué)院《大學(xué)英語跨文化交際》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年上海市建筑安全員-B證(項(xiàng)目經(jīng)理)考試題庫
- 2025重慶建筑安全員-C證考試題庫
- 貴陽信息科技學(xué)院《證券投資學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年浙江建筑安全員《C證》考試題庫及答案
- 廣州幼兒師范高等??茖W(xué)校《生物技術(shù)綜合性實(shí)驗(yàn)?zāi)K》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025廣東省安全員-A證考試題庫附答案
- 廣州新華學(xué)院《影視導(dǎo)演實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年天津建筑安全員考試題庫
- 2025年四川省安全員知識題庫附答案
- 醫(yī)學(xué)教程 常見急救藥品的作用與用途
- 公司解散清算的法律意見書、債權(quán)處理法律意見書
- 公路橋梁工程施工安全風(fēng)險(xiǎn)評估指南
- 2024-2030年全球及中國通過硅通孔(TSV)技術(shù)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 2024年秋季學(xué)期新Join In劍橋版(三年級起)英語三年級上冊課件 Supplementary activities Unit 6
- 2024年新人教版道德與法治七年級上冊全冊教案(新版教材)
- 初中物理期末復(fù)習(xí)+專題5+綜合能力題+課件++人教版物理九年級全一冊
- 2024年國開電大 統(tǒng)計(jì)學(xué)原理 形成性考核冊答案
- Unit13 同步教學(xué)設(shè)計(jì)2023-2024學(xué)年人教版九年級英語全冊
- 合伙經(jīng)營合作社協(xié)議書
- 廊坊市區(qū)普通住宅區(qū)物業(yè)服務(wù)等級標(biāo)準(zhǔn)
評論
0/150
提交評論