版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、編譯原理課程設計報告編譯原理課程設計報告班級:_1611102_學號:_161110202_姓 名:_潘詩映_2014-01-01一、設計任務l 課程設計題目一個PASCAL語言子集(PL/0)編譯器的設計與實現(xiàn)l PL/0語言的BNF描述(擴充的巴克斯范式表示法)<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>:復合語句 ;<statement>:語句;<exp>:表達式 ;<lexp>:條件 ;<term>:項 ; <factor>:因子 ;<aop>:加法運算符;<mop>:乘法運算符; <lop>:關系運算符。l 假想目標機的代碼LIT 0 ,a 取常量a放入數(shù)據(jù)棧棧頂OPR 0 ,a 執(zhí)行運算,a表示執(zhí)行某種運算LOD L ,a 取變量(相對地址為a,層差為L)放到數(shù)據(jù)棧的棧頂STO L ,a 將數(shù)
6、據(jù)棧棧頂?shù)膬热荽嫒胱兞浚ㄏ鄬Φ刂窞閍,層次差為L)CAL L ,a 調用過程(轉子指令)(入口地址為a,層次差為L)INT 0 ,a 數(shù)據(jù)棧棧頂指針增加aJMP 0 ,a無條件轉移到地址為a的指令JPC 0 ,a 條件轉移指令,轉移到地址為a的指令RED L ,a 讀數(shù)據(jù)并存入變量(相對地址為a,層次差為L)WRT 0 ,0 將棧頂內容輸出代碼的具體形式:F L A其中:F段代表偽操作碼 L段代表調用層與說明層的層差值 A段代表位移量(相對地址)進一步說明:INT:為被調用的過程(包括主過程)在運行棧S中開辟數(shù)據(jù)區(qū),這時A段為所需數(shù)據(jù)單元個數(shù)(包括三個連接數(shù)據(jù));L段恒為0。CAL:調用過程,
7、這時A段為被調用過程的過程體(過程體之前一條指令)在目標程序區(qū)的入口地址。LIT:將常量送到運行棧S的棧頂,這時A段為常量值。LOD:將變量送到運行棧S的棧頂,這時A段為變量所在說明層中的相對位置。STO:將運行棧S的棧頂內容送入某個變量單元中,A段為變量所在說明層中的相對位置。JMP:無條件轉移,這時A段為轉向地址(目標程序)。JPC:條件轉移,當運行棧S的棧頂?shù)牟紶栔禐榧伲?)時,則轉向A段所指目標程序地址;否則順序執(zhí)行。OPR:關系或算術運算,A段指明具體運算,例如A=2代表算術運算“”;A12代表關系運算“>”;A16代表“讀入”操作等等。運算對象取自運行棧S的棧頂及次棧頂。l
8、假想機的結構兩個存儲器:存儲器CODE,用來存放P的代碼 數(shù)據(jù)存儲器STACK(棧)用來動態(tài)分配數(shù)據(jù)空間四個寄存器:一個指令寄存器I:存放當前要執(zhí)行的代碼一個棧頂指示器寄存器T:指向數(shù)據(jù)棧STACK的棧頂一個基地址寄存器B:存放當前運行過程的數(shù)據(jù)區(qū)在STACK中的起始地址一個程序地址寄存器P:存放下一條要執(zhí)行的指令地址該假想機沒有供運算用的寄存器。所有運算都要在數(shù)據(jù)棧STACK的棧頂兩個單元之間進行,并用運算結果取代原來的兩個運算對象而保留在棧頂。l 活動記錄:RADLSLRA:返回地址DL:調用者的活動記錄首地址SL:保存該過程直接外層的活動記錄首地址過程返回可以看成是執(zhí)行一個特殊的OPR運
9、算注意:層次差為調用層次與定義層次的差值l 程序實現(xiàn)要求PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個編譯解釋執(zhí)行系統(tǒng)。PL/0的目標程序為假想棧式計算機的匯編語言,與具體計算機無關。PL/0的編譯程序和目標程序的解釋執(zhí)行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機器上實現(xiàn)。其編譯過程采用一趟掃描方式,以語法分析程序為核心,詞法分析和代碼生成程序都作為一個獨立的過程,當語法分析需要讀單詞時就調用詞法分析程序,而當語法分析正確需要生成相應的目標代碼時,則調用代碼生成程序。用表格管理程序建立變量、常量和過程標示符的說明與引用之間的信息聯(lián)系。用出
10、錯處理程序對詞法和語法分析遇到的錯誤給出在源程序中出錯的位置和錯位性質。當源程序編譯正確時,PL/0編譯程序自動調用解釋執(zhí)行程序,對目標代碼進行解釋執(zhí)行,并按用戶程序的要求輸入數(shù)據(jù)和輸出運行結果。l 時間要求按照規(guī)定,編譯課程設計時間為一周。18周末提交。二、功能結構設計PL/0編譯程序源語言(PL/0) 目標語言(類 pcode)實現(xiàn)語言(C+)PL/0 語言程序 類 pcode代碼 PL/0 類 pcode C+ 程序結構流程:PL/0源程序PL/0編譯程序類 pcode代碼類 pcode解釋程序 輸入 輸出PL/0編譯程序包含詞法分析器、語法分析器、類pcode解釋執(zhí)行程序三個大塊,其中
11、語法分析中包含了語義分析,中間代生成,確定分析過程中均沒有錯誤后對中間代碼進行解釋執(zhí)行。否則在相應出錯位置報錯PL/0源程序程序結構:詞法分析程序語法語義分析程序代碼生成程序表格管理程序出錯處理程序目標程序以語法語義分析為核心,調用詞法分析得到單詞,配合表格管理生成中間代碼,出錯則調用出錯處理程序處理,否則解釋執(zhí)行中間代碼詞法分析器的作用與實現(xiàn):從txt文件中讀取PL/0語言編寫的源程序,每次獲取一個單詞。通過每次讀取文件中的一個字符實現(xiàn),若讀取的字符為空字符,換行符,則跳過,直至取到第一個有效字符,繼續(xù)讀取字符,直至生成一個有效的字符串,如遇到不可識別字符則報錯。返回有效單詞的單詞種別碼,內
12、容,和值,用Word結構體實現(xiàn),同時輸出單詞的內容。語法分析的功能與實現(xiàn):語法分析每次調用詞法分析器產生一個單詞,并對之進行識別和處理。語法分析以一個表達式為單位,讀到相應單詞則進入處理該單詞的入口函數(shù),均無入口則報錯,途中遇到均無相應產生式可產生該句子的單詞也報錯。出錯處理主要有報告該單詞不可識別,或該單詞前缺少什么字符這兩類報錯。由于在詞法分析中已經(jīng)輸出該單詞的內容,所以相當于整個源程序都會被輸出,則相應出錯地方則很容易被識別并能幫助修改。部分錯誤如缺少read后缺少(等錯誤可報錯后繼續(xù)識別,不影響后續(xù)代碼的分析,但有些錯誤,如多了+等可能導致后續(xù)字符不能識別,但錯誤控制在一個表達式內。同
13、時在語法分析中包含了靜態(tài)語義檢查,如使用的變量是否已經(jīng)定義等。生成的中間代碼操作碼經(jīng)過編號,存儲編號即可中間代碼的解釋執(zhí)行的功能與實現(xià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單詞內部保存于識別多依賴編碼Pcode指令編號1LIT 0 a將常數(shù)取至棧頂,a為常數(shù)值2LOD l a將變量取至棧頂,a為偏移量,1為層差3STO l a將棧頂元素送至某內存單元,a為偏移量,l為層差4CAL 1 a調用過程,a為過程地址,l為層差5INT 0 a在運行棧中為被調用的過程開辟a個單元的數(shù)據(jù)區(qū)6JMP 0 a無條件跳轉至a地址7JPC 0 a條件跳轉,當棧頂布爾值非真跳轉至a地址,否則順序執(zhí)行8OPR 0 0調用過程結束后,返回調用點并退棧9OPR 0 1棧頂元素取反10OPR 0 2次棧頂與棧頂元素相加,退
15、兩個棧,結果值進棧11OPR 03次棧頂減去棧頂,退兩個棧元素,結果值進棧12OPR 04次棧頂乘以棧頂,退兩個棧元素,結果值進棧13OPR05次棧頂除以棧頂,退兩個棧元素,結果值進棧14OPR06棧頂元素值奇偶判斷,結果值進棧15OPR07次棧頂與棧頂是否相等,退兩個棧元素,結果值進棧16OPR08次棧頂與棧項是否不等,退兩個棧元素,結果值進棧17OPR09次棧頂是否小于棧頂項,退兩個棧元素,結果值進棧18OPR010次棧頂是否小于等于棧頂項,退兩個棧元素,結果值進棧19OPR011次棧頂是否大于棧頂項,退兩個棧元素,結果值進棧20OPR012次棧頂是否大于等于棧頂項,退兩個棧元素,結果值進
16、棧21OPR013棧值輸出至屏幕22OPR014命令行將一項寫入棧頂在保存中間代碼時,對操作進行編碼,共8個,即LIT到OPR三、 函數(shù)說明棧,結構體,全局變量的定義#define TRUE 1;#define FALSE 0;#define KEYsym 15 /15個關鍵字int success=1; /編譯成功,有錯則置0struct Word /詞法分析過后返回單詞包含的信息char sym20;int code;int num;struct SYM /符號表保存的信息char name20; /新標識符的名稱int type; /類型int offset; /相對地址int leve
17、l; /層數(shù)int paranum; /每個過程說明所占用的空間,只在過程名稱有定義int num; /值,過程則寫入需要回填的語句下標int size; /過程的大小;struct PCode /中間代碼保存的信息int f; /偽操作碼int l; /層差int a; /偏移量;PCode Code500; /代碼棧SYM Table200; /符號表int Wback100; /保存回填語句下標int STACK200; /數(shù)據(jù)棧int bcount=0; /需要回填語句的個數(shù)int TOP=0; /符號表棧頂int LEVEL=0; /當前層數(shù)int cx=0,tx; /Code的下標
18、指針,Table的下標指針PCode I; /當前執(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ù)字 int Reserve(char kt10,char str); /判斷時候是否為關鍵字 void Retract(fstream &
19、file); /將搜索指示器回調一個字符位置int CharToInt(char str); /字符型向整型轉化VoidGetChar(fstream&file,char&ch); /從文件中讀取一個字符到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); /項void Exp(fstream &file ,Word &w); /表達式void Lexp(fstream &file ,Word &w); /條件int Statement(fstream &file ,Word &w); /語句void Body(fstream &file ,Word &w); /復合語句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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《財務復習》課件
- 2024年物業(yè)安保服務合同(小區(qū)門衛(wèi)版)3篇
- 2024年航空器材物流及維修服務協(xié)議
- 2024年版權買賣合同3篇
- 《財產課稅制》課件
- 《園林鋪裝細節(jié)提升》課件
- 2025版采購合同詳細規(guī)定3篇
- 2024手機配件回收再利用合作協(xié)議3篇
- 2024年跨區(qū)域水資源調配工程協(xié)議版B版
- 城市道路工程幕墻安裝施工協(xié)議
- JB-T 4088.1-2022 日用管狀電熱元件 第1部分:通用要求
- JGJT341-2014 泡沫混凝土應用技術規(guī)程
- 鋼結構安裝工程旁站監(jiān)理記錄表
- 人教版英語五年級上冊 Unit 2 Part A
- 常見中藥價格表
- IDC云數(shù)據(jù)中心機房運維服務解決方案
- 維西縣城市生活垃圾熱解處理工程環(huán)評報告
- GB/T 9128.2-2023鋼制管法蘭用金屬環(huán)墊第2部分:Class系列
- 網(wǎng)絡經(jīng)濟學PPT完整全套教學課件
- 2023年主治醫(yī)師(中級)-臨床醫(yī)學檢驗學(中級)代碼:352考試參考題庫附帶答案
- 機械原理課程設計鎖梁自動成型機床切削機構
評論
0/150
提交評論