




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、編譯原理課程設(shè)計(jì)報(bào)告編譯原理課程設(shè)計(jì)報(bào)告班級:_1611102_學(xué)號:_161110202_姓 名:_潘詩映_2014-01-01一、設(shè)計(jì)任務(wù)l 課程設(shè)計(jì)題目一個(gè)PASCAL語言子集(PL/0)編譯器的設(shè)計(jì)與實(shí)現(xiàn)l PL/0語言的BNF描述(擴(kuò)充的巴克斯范式表示法)<prog> program <id>;<block><block> <condecl><vardecl><proc><body><condecl> const <const>,<const><c
2、onst> <id>:=<integer><vardecl> var <id>,<id><proc> procedure <id>(<id>,<id>);<block><proc><body> begin <statement><statement>end<statement> <id> := <exp> |if <lexp> then <statement>el
3、se <statement> |while <lexp> do <statement> |call <id>(<exp>,<exp>) |<body> |read (<id>,<id>) |write (<exp>,<exp>)<lexp> <exp> <lop> <exp>|odd <exp><exp> +|-<term><aop><term><te
4、rm> <factor><mop><factor><factor><id>|<integer>|(<exp>)<lop> =|<>|<|<=|>|>=<aop> +|-<mop> *|/<id> ll|d (注:l表示字母)<integer> dd注釋:<prog>:程序 ;<block>:塊、程序體 ;<condecl>:常量說明 ;<const>:常量;<
5、;vardecl>:變量說明 ;<proc>:分程序 ; <body>:復(fù)合語句 ;<statement>:語句;<exp>:表達(dá)式 ;<lexp>:條件 ;<term>:項(xiàng) ; <factor>:因子 ;<aop>:加法運(yùn)算符;<mop>:乘法運(yùn)算符; <lop>:關(guān)系運(yùn)算符。l 假想目標(biāo)機(jī)的代碼LIT 0 ,a 取常量a放入數(shù)據(jù)棧棧頂OPR 0 ,a 執(zhí)行運(yùn)算,a表示執(zhí)行某種運(yùn)算LOD L ,a 取變量(相對地址為a,層差為L)放到數(shù)據(jù)棧的棧頂STO L ,a 將數(shù)
6、據(jù)棧棧頂?shù)膬?nèi)容存入變量(相對地址為a,層次差為L)CAL L ,a 調(diào)用過程(轉(zhuǎn)子指令)(入口地址為a,層次差為L)INT 0 ,a 數(shù)據(jù)棧棧頂指針增加aJMP 0 ,a無條件轉(zhuǎn)移到地址為a的指令JPC 0 ,a 條件轉(zhuǎn)移指令,轉(zhuǎn)移到地址為a的指令RED L ,a 讀數(shù)據(jù)并存入變量(相對地址為a,層次差為L)WRT 0 ,0 將棧頂內(nèi)容輸出代碼的具體形式:F L A其中:F段代表偽操作碼 L段代表調(diào)用層與說明層的層差值 A段代表位移量(相對地址)進(jìn)一步說明:INT:為被調(diào)用的過程(包括主過程)在運(yùn)行棧S中開辟數(shù)據(jù)區(qū),這時(shí)A段為所需數(shù)據(jù)單元個(gè)數(shù)(包括三個(gè)連接數(shù)據(jù));L段恒為0。CAL:調(diào)用過程,
7、這時(shí)A段為被調(diào)用過程的過程體(過程體之前一條指令)在目標(biāo)程序區(qū)的入口地址。LIT:將常量送到運(yùn)行棧S的棧頂,這時(shí)A段為常量值。LOD:將變量送到運(yùn)行棧S的棧頂,這時(shí)A段為變量所在說明層中的相對位置。STO:將運(yùn)行棧S的棧頂內(nèi)容送入某個(gè)變量單元中,A段為變量所在說明層中的相對位置。JMP:無條件轉(zhuǎn)移,這時(shí)A段為轉(zhuǎn)向地址(目標(biāo)程序)。JPC:條件轉(zhuǎn)移,當(dāng)運(yùn)行棧S的棧頂?shù)牟紶栔禐榧伲?)時(shí),則轉(zhuǎn)向A段所指目標(biāo)程序地址;否則順序執(zhí)行。OPR:關(guān)系或算術(shù)運(yùn)算,A段指明具體運(yùn)算,例如A=2代表算術(shù)運(yùn)算“”;A12代表關(guān)系運(yùn)算“>”;A16代表“讀入”操作等等。運(yùn)算對象取自運(yùn)行棧S的棧頂及次棧頂。l
8、假想機(jī)的結(jié)構(gòu)兩個(gè)存儲器:存儲器CODE,用來存放P的代碼 數(shù)據(jù)存儲器STACK(棧)用來動(dòng)態(tài)分配數(shù)據(jù)空間四個(gè)寄存器:一個(gè)指令寄存器I:存放當(dāng)前要執(zhí)行的代碼一個(gè)棧頂指示器寄存器T:指向數(shù)據(jù)棧STACK的棧頂一個(gè)基地址寄存器B:存放當(dāng)前運(yùn)行過程的數(shù)據(jù)區(qū)在STACK中的起始地址一個(gè)程序地址寄存器P:存放下一條要執(zhí)行的指令地址該假想機(jī)沒有供運(yùn)算用的寄存器。所有運(yùn)算都要在數(shù)據(jù)棧STACK的棧頂兩個(gè)單元之間進(jìn)行,并用運(yùn)算結(jié)果取代原來的兩個(gè)運(yùn)算對象而保留在棧頂。l 活動(dòng)記錄:RADLSLRA:返回地址DL:調(diào)用者的活動(dòng)記錄首地址SL:保存該過程直接外層的活動(dòng)記錄首地址過程返回可以看成是執(zhí)行一個(gè)特殊的OPR運(yùn)
9、算注意:層次差為調(diào)用層次與定義層次的差值l 程序?qū)崿F(xiàn)要求PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng)。PL/0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語言,與具體計(jì)算機(jī)無關(guān)。PL/0的編譯程序和目標(biāo)程序的解釋執(zhí)行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機(jī)器上實(shí)現(xiàn)。其編譯過程采用一趟掃描方式,以語法分析程序?yàn)楹诵?,詞法分析和代碼生成程序都作為一個(gè)獨(dú)立的過程,當(dāng)語法分析需要讀單詞時(shí)就調(diào)用詞法分析程序,而當(dāng)語法分析正確需要生成相應(yīng)的目標(biāo)代碼時(shí),則調(diào)用代碼生成程序。用表格管理程序建立變量、常量和過程標(biāo)示符的說明與引用之間的信息聯(lián)系。用出
10、錯(cuò)處理程序?qū)υ~法和語法分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和錯(cuò)位性質(zhì)。當(dāng)源程序編譯正確時(shí),PL/0編譯程序自動(dòng)調(diào)用解釋執(zhí)行程序,對目標(biāo)代碼進(jìn)行解釋執(zhí)行,并按用戶程序的要求輸入數(shù)據(jù)和輸出運(yùn)行結(jié)果。l 時(shí)間要求按照規(guī)定,編譯課程設(shè)計(jì)時(shí)間為一周。18周末提交。二、功能結(jié)構(gòu)設(shè)計(jì)PL/0編譯程序源語言(PL/0) 目標(biāo)語言(類 pcode)實(shí)現(xiàn)語言(C+)PL/0 語言程序 類 pcode代碼 PL/0 類 pcode C+ 程序結(jié)構(gòu)流程:PL/0源程序PL/0編譯程序類 pcode代碼類 pcode解釋程序 輸入 輸出PL/0編譯程序包含詞法分析器、語法分析器、類pcode解釋執(zhí)行程序三個(gè)大塊,其中
11、語法分析中包含了語義分析,中間代生成,確定分析過程中均沒有錯(cuò)誤后對中間代碼進(jìn)行解釋執(zhí)行。否則在相應(yīng)出錯(cuò)位置報(bào)錯(cuò)PL/0源程序程序結(jié)構(gòu):詞法分析程序語法語義分析程序代碼生成程序表格管理程序出錯(cuò)處理程序目標(biāo)程序以語法語義分析為核心,調(diào)用詞法分析得到單詞,配合表格管理生成中間代碼,出錯(cuò)則調(diào)用出錯(cuò)處理程序處理,否則解釋執(zhí)行中間代碼詞法分析器的作用與實(shí)現(xiàn):從txt文件中讀取PL/0語言編寫的源程序,每次獲取一個(gè)單詞。通過每次讀取文件中的一個(gè)字符實(shí)現(xiàn),若讀取的字符為空字符,換行符,則跳過,直至取到第一個(gè)有效字符,繼續(xù)讀取字符,直至生成一個(gè)有效的字符串,如遇到不可識別字符則報(bào)錯(cuò)。返回有效單詞的單詞種別碼,內(nèi)
12、容,和值,用Word結(jié)構(gòu)體實(shí)現(xiàn),同時(shí)輸出單詞的內(nèi)容。語法分析的功能與實(shí)現(xiàn):語法分析每次調(diào)用詞法分析器產(chǎn)生一個(gè)單詞,并對之進(jìn)行識別和處理。語法分析以一個(gè)表達(dá)式為單位,讀到相應(yīng)單詞則進(jìn)入處理該單詞的入口函數(shù),均無入口則報(bào)錯(cuò),途中遇到均無相應(yīng)產(chǎn)生式可產(chǎn)生該句子的單詞也報(bào)錯(cuò)。出錯(cuò)處理主要有報(bào)告該單詞不可識別,或該單詞前缺少什么字符這兩類報(bào)錯(cuò)。由于在詞法分析中已經(jīng)輸出該單詞的內(nèi)容,所以相當(dāng)于整個(gè)源程序都會被輸出,則相應(yīng)出錯(cuò)地方則很容易被識別并能幫助修改。部分錯(cuò)誤如缺少read后缺少(等錯(cuò)誤可報(bào)錯(cuò)后繼續(xù)識別,不影響后續(xù)代碼的分析,但有些錯(cuò)誤,如多了+等可能導(dǎo)致后續(xù)字符不能識別,但錯(cuò)誤控制在一個(gè)表達(dá)式內(nèi)。同
13、時(shí)在語法分析中包含了靜態(tài)語義檢查,如使用的變量是否已經(jīng)定義等。生成的中間代碼操作碼經(jīng)過編號,存儲編號即可中間代碼的解釋執(zhí)行的功能與實(shí)現(xiàn):為中間代碼的操作碼賦予含義動(dòng)作,如“+”是棧頂與次棧頂項(xiàng)相加,并退兩個(gè)棧元素,使結(jié)果值進(jìn)棧。單詞種別和屬性表單詞符號種別碼 單詞符號種別碼program1:=19procedure2<20const3<=21begin4>22var5>=23If6=24Then7<>25else8+26while9-27do10*28end11/29call12;30read13,31 write14(32 odd15)3334lettet
14、(letter|digit)*1735dight dight*1836單詞內(nèi)部保存于識別多依賴編碼Pcode指令編號1LIT 0 a將常數(shù)取至棧頂,a為常數(shù)值2LOD l a將變量取至棧頂,a為偏移量,1為層差3STO l a將棧頂元素送至某內(nèi)存單元,a為偏移量,l為層差4CAL 1 a調(diào)用過程,a為過程地址,l為層差5INT 0 a在運(yùn)行棧中為被調(diào)用的過程開辟a個(gè)單元的數(shù)據(jù)區(qū)6JMP 0 a無條件跳轉(zhuǎn)至a地址7JPC 0 a條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真跳轉(zhuǎn)至a地址,否則順序執(zhí)行8OPR 0 0調(diào)用過程結(jié)束后,返回調(diào)用點(diǎn)并退棧9OPR 0 1棧頂元素取反10OPR 0 2次棧頂與棧頂元素相加,退
15、兩個(gè)棧,結(jié)果值進(jìn)棧11OPR 03次棧頂減去棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧12OPR 04次棧頂乘以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧13OPR05次棧頂除以棧頂,退兩個(gè)棧元素,結(jié)果值進(jìn)棧14OPR06棧頂元素值奇偶判斷,結(jié)果值進(jìn)棧15OPR07次棧頂與棧頂是否相等,退兩個(gè)棧元素,結(jié)果值進(jìn)棧16OPR08次棧頂與棧項(xiàng)是否不等,退兩個(gè)棧元素,結(jié)果值進(jìn)棧17OPR09次棧頂是否小于棧頂項(xiàng),退兩個(gè)棧元素,結(jié)果值進(jìn)棧18OPR010次棧頂是否小于等于棧頂項(xiàng),退兩個(gè)棧元素,結(jié)果值進(jìn)棧19OPR011次棧頂是否大于棧頂項(xiàng),退兩個(gè)棧元素,結(jié)果值進(jìn)棧20OPR012次棧頂是否大于等于棧頂項(xiàng),退兩個(gè)棧元素,結(jié)果值進(jìn)
16、棧21OPR013棧值輸出至屏幕22OPR014命令行將一項(xiàng)寫入棧頂在保存中間代碼時(shí),對操作進(jìn)行編碼,共8個(gè),即LIT到OPR三、 函數(shù)說明棧,結(jié)構(gòu)體,全局變量的定義#define TRUE 1;#define FALSE 0;#define KEYsym 15 /15個(gè)關(guān)鍵字int success=1; /編譯成功,有錯(cuò)則置0struct Word /詞法分析過后返回單詞包含的信息char sym20;int code;int num;struct SYM /符號表保存的信息char name20; /新標(biāo)識符的名稱int type; /類型int offset; /相對地址int leve
17、l; /層數(shù)int paranum; /每個(gè)過程說明所占用的空間,只在過程名稱有定義int num; /值,過程則寫入需要回填的語句下標(biāo)int size; /過程的大小;struct PCode /中間代碼保存的信息int f; /偽操作碼int l; /層差int a; /偏移量;PCode Code500; /代碼棧SYM Table200; /符號表int Wback100; /保存回填語句下標(biāo)int STACK200; /數(shù)據(jù)棧int bcount=0; /需要回填語句的個(gè)數(shù)int TOP=0; /符號表?xiàng)m攊nt LEVEL=0; /當(dāng)前層數(shù)int cx=0,tx; /Code的下標(biāo)
18、指針,Table的下標(biāo)指針PCode I; /當(dāng)前執(zhí)行指令int T,B,P; /棧頂指示寄存器,基地址寄存器,程序地址寄存器詞法分析器:int IsLetter(char ch); /判斷是否為字母 void GetBC(fstream &file,char &ch); /檢查ch中的字符是否為空白void Concat(char str,char ch); /拼接函數(shù)int IsDigit (char ch); /判斷時(shí)候是否為數(shù)字 int Reserve(char kt10,char str); /判斷時(shí)候是否為關(guān)鍵字 void Retract(fstream &
19、file); /將搜索指示器回調(diào)一個(gè)字符位置int CharToInt(char str); /字符型向整型轉(zhuǎn)化VoidGetChar(fstream&file,char&ch); /從文件中讀取一個(gè)字符到chvoid cifa(fstream &file,Word &w); /詞法分析器語法分析器:(包含語義分析和中間代碼生成)int Factor(fstream &file ,Word &w); /因子void prog(fstream &file,Word &w); /主過程void Proc(fstream &fi
20、le ,Word &w); /子過程void Condecl(fstream &file ,Word &w); /常量void Vardecl(fstream &file ,Word &w); /變量void Term(fstream &file ,Word &w); /項(xiàng)void Exp(fstream &file ,Word &w); /表達(dá)式void Lexp(fstream &file ,Word &w); /條件int Statement(fstream &file ,Word &w); /語句void Body(fstream &file ,Word &w); /復(fù)合語句void Block(fstream &file ,Word &w); /塊int End(Word &w); /程序是否已編譯完成void yufa(fstream &file) /語法分析語義分析:void Enter(SYM &s); /變量常量過程說明,加入符號表int Position(Word &w,SYM &s
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工傷事故賠償協(xié)議書范例
- 二零二五版商場店鋪?zhàn)赓U合同范例
- 二零二五無息借款協(xié)議合同
- 攤位簡單轉(zhuǎn)讓合同范例
- 二零二五版施工隊(duì)協(xié)議合同書
- 房地產(chǎn)交換協(xié)議書
- 二零二五版工程項(xiàng)目保證金合同書
- 停車場租用合同范例二零二五年
- 公路養(yǎng)護(hù)安全意識培訓(xùn)
- 2025二手房買賣合同模板(最詳細(xì))
- (完整版)曲臂式高處作業(yè)車輛安全技術(shù)交底
- 深圳市企業(yè)職工養(yǎng)老保險(xiǎn)養(yǎng)老金申請表
- 5.1.2導(dǎo)數(shù)的概念及其幾何意義 第一課時(shí) 課件
- 食品欺詐和預(yù)防知識專題培訓(xùn)課件
- 中級社會工作者法規(guī)與政策真題及答案解析
- 鋼管材質(zhì)證明書
- 勞務(wù)費(fèi)簽領(lǐng)表
- 國家重點(diǎn)保護(hù)野生植物采集申請表
- 高中語文:陳情表
- 數(shù)字信息技術(shù)與中學(xué)思政課教育教學(xué)深度融合
- 江蘇省交通技師學(xué)院教師招聘考試真題2022
評論
0/150
提交評論