編譯原理課程設計增加數(shù)據(jù)類型解析_第1頁
編譯原理課程設計增加數(shù)據(jù)類型解析_第2頁
編譯原理課程設計增加數(shù)據(jù)類型解析_第3頁
編譯原理課程設計增加數(shù)據(jù)類型解析_第4頁
編譯原理課程設計增加數(shù)據(jù)類型解析_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、山東建筑大學計算機科學與技術(shù)學院課程設計說明書題 目: 對PL/O語言及其編譯器進行擴充和修改實現(xiàn)增加數(shù)據(jù)類型的功能課程:編譯原理課程設計院(部):計算機科學與技術(shù)學院專業(yè):計算機科學與技術(shù)班級:計科學生姓名:學號:指導教師:完成日期:2014年7月8日山東建筑大學計算機學院課程設計說明書目錄課程設計任務書II對PL/O語言及其編譯器進行擴充和修改一一實現(xiàn)增加數(shù)據(jù)類型的功能 3一、問題描述 3二、基本要求4三、算法思想4四、數(shù)據(jù)結(jié)構(gòu)4五、模塊劃分4六、源程序5七、測試數(shù)據(jù)15八、測試情況17結(jié)論18參考文獻19課程設計指導教師評語 20III山東建筑大學計算機科學與技術(shù)學院課程設計任務書設計題

2、目對PL/O語言及其編譯器進行擴充和修改實現(xiàn)增加數(shù)據(jù)類型的功能已知技術(shù)參 數(shù)和設計要 求PL/0程序設計語言是一個較簡單的語言,它以賦值語句為基礎,構(gòu)造 概念有順序、條件和重復(循環(huán))三種。PL/0有子程序概念,包括過程定義(可以嵌套)與調(diào)用且有局部變量說明。PL/0中唯一的數(shù)據(jù)類型是整型,可以用來說明該類型的常量和變量。當然PL/0也具有通常的算術(shù)運算和關(guān)系運算。通過讀懂源程序,全面掌握編譯原理的基本實現(xiàn)過程。對現(xiàn)存的PL/0編譯程序做一些修改或擴充。設計內(nèi) 容與步 驟通過讀懂源程序,全面掌握編譯原理的基本實現(xiàn)過程。 擴充PL/0增加識別字符型數(shù)據(jù)類型和實型數(shù)據(jù)類型的功能 增加的數(shù)據(jù)類型的定

3、義如下:D pi nteger id |char id |double id設計工作計劃與進度安排1-4:進行完整的編譯程序全過程的理解5-12 :根據(jù)源程序,理解整個編譯器的編寫中涉及到的全局變量及基本函數(shù) 的意義。13-20 :在讀懂全程序的基礎上,進行擴充功能,并測試。21-24 :撰寫課程設計報告書。設計考核要求設計考核方法:課程設計總成績=算法實現(xiàn)(30%) +課程設計說明書(50%) +平時考 勤( 20% )。設計考核要求:(1)規(guī)范的課程設計說明書(2)所設計的算法源代碼指導教師(簽字)教研室主任(簽字)山東建筑大學計算機學院課程設計說明書對PL/O語言及其編譯器進行擴充和修改

4、型的功能實現(xiàn)增加數(shù)據(jù)類一、問題描述PL/0程序設計語言是一個較簡單的語言,它以賦值語句為基礎,構(gòu)造概念有順序、條件和重復(循環(huán))三種。 PL/0有子程序概念,包括過程定義(可以嵌套)與調(diào)用且有局部 變量說明。PL/0中唯一的數(shù)據(jù)類型是整型,可以用來說明該類型的常量和變量。當然PL/0也具有通常的算術(shù)運算和關(guān)系運算。PL/0語言的BNF文法如下所示:程序 := 程序體.程序體常量說明部分常量定義無符號整數(shù)變量說明部分標識符過程說明部分過程首部語句 語句|空賦值語句復合語句條件表達式項因子加法運算符乘法運算符關(guān)系運算符條件語句過程調(diào)用語句當型循環(huán)語句字母數(shù)字=常量說明部分 變量說明部分 過程說明部

5、分 語句=CONST常量定義,常量定義;= 標識符 = 無符號整數(shù)= 數(shù)字數(shù)字=VAR標識符,標識符;= 字母字母|數(shù)字= 過程首部 程序體;過程說明部分;=PROCEDURE 標識符 ;= 賦值語句|條件語句|當型循環(huán)語句|過程調(diào)用語句|復合 = 標識符 := 表達式=BEGIN 語句 ; 語句 END= 表達式 關(guān)系運算符 表達式|ODD表達式=+卜 項加法運算符 項= 因子乘法運算符 因子= 標識符|無符號整數(shù)|'('表達式')'=+卜=*|/=|#|=|=IF條件THEN語句=CALL標識符 =WHILE 條件D0語句=a|b|.|X|Y|Z=0|1|2

6、|.|8|9對現(xiàn)存的PL/0編譯程序做如下修改或擴充。(1)擴充識別注釋功能:注釋由(*和*)包含,不允許嵌套。(2)識別對else子句進行處理的功能條件語句:=IF條件THEN語句ELSE語句二、基本要求設計目的:掌握PL/O語言編譯器實現(xiàn)的基本原理和實現(xiàn)方法。能在理解其實現(xiàn)原理的方法的基礎 上進行適當?shù)臄U充,使其功能更強大。設計要求:在理解源代碼的基礎上,根據(jù)文法的要求,采用C語言擴充算法。完成擴充識別注釋功能,和識別對 else子句進行處理的功能三、算法思想增加數(shù)據(jù)類型的功能:因子語法描述該為EBNF文法為: 因子 :=標識符|無符號整數(shù)|整型|字符型|浮點型|'( 表達式

7、9;'四、數(shù)據(jù)結(jié)構(gòu)#define norw 16關(guān)鍵字的個數(shù)#define txmax 100 /名 字表的容量#define nmax 14數(shù)字的最大位數(shù)#define al 10/符號的最大長度#define amax 2047 地址上界#define levmax 3/最大允許的嵌套聲明層數(shù)#define cxmax 200/最多的虛擬機代碼數(shù) enum symbol/枚舉類型:/nul=0,ident=1,number=2,plus=3, minus=4times=5,依次類推,procsym=31nul,ident,number,/下面的表示的是系統(tǒng)的算數(shù)運算符以及邏輯運算符

8、,知道意思就可以plus,minus,times,/相乘的意思slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,/ 左括號rparen,comma,semicolon, period,becomes/ 賦值的意思/下面的表示是系統(tǒng)的保留字beginsym, endsym, ifsym.thensym, whilesym,23callsym,writesym, readsym, dosym,constsym, varsym, procsym,integersym,charactersym,doublesym.;#define symnum 35 enum o

9、bject constant, variable, procedur, integer, character, doubler,;五、模塊劃分過程或函數(shù)名簡要功能說明pl0主程序Error出錯處理,打印出錯位置和錯誤編碼Getsym詞法分析,讀取一個單詞Getch漏掉空格,讀取一個字符Gen生成目標代碼,并送入目標程序區(qū)Test測試當前單詞符號是否合法Block分程序分析處理過程En ter登錄名字表positi on(函數(shù))查找標識符在名字表中的位置Con stdeclarati on常量定義處理Vardeclarati on變量說明處理Listode列出目標代碼清單Stateme nt語句

10、處理Expressi on表達式處理Term項處理Factor因子處理Con diti onIn terpret base(函數(shù))六、源程序條件處理對目標代碼的解釋執(zhí)行程序 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址1、/該函數(shù)的功能就是取一個數(shù)據(jù)單位,通過調(diào)用該函數(shù)可以一次取出一個數(shù)字或字符串或運算符,這個函數(shù)和getch函數(shù)我覺得應該是調(diào)用最經(jīng)常地函數(shù)啦,每調(diào)用一次該函數(shù),該函數(shù)就會去調(diào)用getch函數(shù)/sym記錄的是語句單位的類型,num中存放的是數(shù)字的大小int getsym()/取一個數(shù)字單位else加入real類型if (ch>='0'&&ch<=&#

11、39;9')k=0;num=0;sym=intsym;/以 sym 表示這是一個數(shù)字 /* type=i nteger;*/double coun t=0.1;doif(ch='.')getchdo;sym=doublesym;while(ch>='0'&&ch<='9')num=nu m+(ch - 'O')*co unt; k+;coun t*=0.1; getchdo;break;elsenum=10* nu m+ch-'O'k+;getchdo;while(ch>=

12、'0'&&ch<='9'|ch='.');k-;if(k>nmax)/要求數(shù)字位數(shù)不能超過15位,nmax=14,不過我覺得這有錯誤error(30);輸出錯誤碼 elseif(int)ch=39)加入字符類型getchdo;if(ch>='A'&&ch<='Z')|(ch>='a'&&ch<='z') num=(i nt)ch;getchdo;if(i nt)ch=39)sym=charsym;el

13、senum=0;sym=n ul;error(49);/類型錯誤elseerror(49); getchdo;2、/cc=cx=ll=0;cx表示源程序中代碼的第幾行block(0,0,nxtlev)這是主程序/nxtlev中已有部分值為 1,大小為32int block(int lev,int tx,bool* fsys)/lev表示分程序所在層,tx表示當前尾指針,fsys表示當前模塊后跟符號集/如果當前字符是變量,則將字符放入table中,形式同上述代碼,如對下面不動的請參照上面的代碼if(sym=i ntsym)getsymdo;doin tdeclarati ondo(& t

14、x,lev, &dx);while(sym=comma)getsymdo;in tdeclarati ondo(&tx,lev,& dx);if(sym=semico Ion)getsymdo;elseerror(5);while(sym=ide nt);/如果當前字符是變量,則將字符放入table中,形式同上述代碼,如對下面不動的請參照上面的代碼if(sym=charsym)getsymdo;dochardeclarati ondo(&tx,lev, &dx);while(sym=comma)getsymdo; chardeclarati ondo(&

15、amp; tx,lev, &dx);if(sym=semico Ion)getsymdo;elseerror(5);while(sym=ide nt);/如果當前字符是變量,則將字符放入table中,形式同上述代碼,如對下面不動的請參照上面的代碼if(sym=doublesym)getsymdo;dodoubleclarati ondo(& tx,lev, &dx);while(sym=comma)getsymdo;doubleclarati ondo(&tx,lev, &dx);if(sym=semico Ion)getsymdo;elseerror(

16、5); while(sym=ide nt);if(tableswitch)/是否列出table表中的內(nèi)容prin tf("TABLE:n");if(txO+1>tx)當table表為空時,只輸出 NULLprin tf("NULLn");for(i=txO+1;i<=tx;i+)/自己修改的switch(tablei.ki nd)自己添加的case in teger:prin tf("%d int %s",i,tablei. name);prin tf("lev=%d addr=%dn",tablei.

17、level,tablei.adr);fprin tf(fas,"%d in teger %s",i,tablei. name);fprin tf(fas,"lev=%d addr=%dn",tablei.level,tablei.adr); break;case character:prin tf("%d character %s",i,tablei. name);prin tf("lev=%d addr=%dn",tablei.level,tablei.adr);fprin tf(fas,"%d cha

18、racter %s",i,tablei. name);fprin tf(fas,"lev=%d addr=%dn",tablei.level,tablei.adr); break;case doubler:prin tf("%d doubler %s",i,tablei. name);prin tf("lev=%d addr=%dn",tablei.level,tablei.adr); fprin tf(fas,"%d doubler %s",i,tablei. name);fprin tf(fas,&q

19、uot;lev=%d addr=%dn",tablei.level,tablei.adr); break;table表中3、/該函數(shù)的功能是將源程序中的常量,變量,分程序符號串輸入到 該table表是從下標1開始的,0號空間另做其它用途/void en ter(e num object k,e num datatype t,i nt* ptx ,int lev ,int * pdx) void en ter(e num object k,i nt* ptx ,int lev ,int * pdx)/ 自己修改的 /case in teger:table(*ptx).level=lev

20、;table(*ptx).adr=(*pdx);(*pdx)+;break;case doubler:table(*ptx).level=lev;table(*ptx).adr=(*pdx);(*pdx)+;break;case character:table(*ptx).level=lev;table(*ptx).adr=(*pdx);(*pdx)+;break;int characterdeclarati on (i nt * ptx,i nt lev,i nt * pdx)如果當前的符號是一個字符類型,則繼續(xù)執(zhí)行if(sym=ide nt)en ter(character,ptx,lev

21、,pdx); getsymdo;elseerror(4);return 0;int in tegerdeclarati on (i nt * ptx,i nt lev,i nt * pdx)如果當前的符號是一個字符類型,則繼續(xù)執(zhí)行if(sym=ide nt)en ter(i nteger,ptx,lev,pdx); getsymdo;elseerror(4);return 0;int doubdeclaratio n(i nt * ptx,i nt lev,i nt * pdx)如果當前的符號是一個字符類型,則繼續(xù)執(zhí)行if(sym=ide nt)en ter(doubler,ptx,lev,p

22、dx); getsymdo;elseerror(4);return 0;4、/遞歸讀取分析每一個語句,該函數(shù)會將整個程序的大部分子程序聯(lián)系起來該程序中大部分是遞歸調(diào)用,雖說代碼很多,但基本都是一個格式,所以讀起來并不復雜 /相對來說還比較簡單/對于代碼實現(xiàn)上差不多的部分,我沒有做過多的注釋int stateme nt(bool* fsys,i nt * ptx,i nt lev)switch(tablei.kind)/ 輸出處理case character:ge ndo(opr,0,21); break;case in teger:gen do(opr,0,14); break;case do

23、ubler:gen do(opr,0,14); break;if(sym=begi nsym) getsymdo;/ 更改! ! ! ! /if(sym=doublesym)sym=ide nt; getsymdo;if(sym=i ntsym)sym=ide nt; getsymdo; if(sym=charsym)sym=ide nt; getsymdo;5、/因子處理int factor (bool* fsys,i nt *ptx,i nt lev)case character:gen do(lod,lev-tablei.level,tablei.adr); break;case in

24、teger:gen do(lod,lev-tablei.level,tablei.adr); break;case doubler:gen do(lod,lev-tablei.level,tablei.adr); break;if(sym=nu mber|sym=i ntsym|sym=charsym|sym=doublesym) / 女口果因子處理時遇至 U數(shù) 字if(num>amax)如果數(shù)字大于最大能表示的數(shù)字,則報錯。amax=2047error(31);num=0;gen do(lit, 0,nu m);getsymdo;6、void in terpret()case 14:

25、/ 14號操作為輸出棧頂值操作/輸出棧頂值cout<<st-1<<e ndl;fprin tf(fa2,"%lfn",st-1); /同時打印到文件t-;棧頂下移break;case 15: 15號操作為輸出換行操作prin tf("n");/ 輸出換行fprin tf(fa2,"n");/同時輸出到文件break;case 16: / 16號操作是接受鍵盤值輸入到棧頂printf("輸入整形數(shù):");/屏顯問號fprintf(fa2,"輸入整形數(shù):");/同時輸出到文件

26、 scanf("%lf",&(st); / 獲得輸入fprin tf(fa2,"%lfn",st); /把用戶輸入值打印到文件t+;II棧頂上移,分配空間break;case 17: II 17號操作為輸出棧頂值操作 prin tf("%c",(i nt)st-1);II 輸出棧頂值fprin tf(fa2,"%cn",st-1); II同時打印到文件t-;棧頂下移break;case 18: II 18號操作為輸出棧頂值操作 prin tf("%lf",st-1); II 輸出棧頂值

27、fprin tf(fa2,"%lfn",st-1); II同時打印到文件t-;棧頂下移break;case 19: II 19號操作是接受鍵盤值輸入到棧頂printf(”輸入單字符:”);II屏顯問號 fprintf(fa2,"輸入單字符:");II同時輸出到文 sca nf("%s",&(st);fprin tf(fa2,"%cn",st); II把用戶輸入值打印到文件 t+;II棧頂上移,分配空間break;case 20: II 20號操作是接受鍵盤值輸入到棧頂 printf(”輸入雙精度型數(shù):”);

28、屏顯問號 fprintf(fa2,"輸入雙精度型數(shù):");II同時輸出到文件 scanf("%lf",&(st); II 獲得輸入 fprin tf(fa2,"%lfn",st); II把用戶輸入值打印到文件t+;II棧頂上移,分配空間break;case 21: II 14號操作為輸出棧頂值操作II輸出棧頂值cout<<(char)st-1<<e ndl;fprin tf(fa2,"%lfn",st-1); II同時打印到文件t-;棧頂下移break;七、測試數(shù)據(jù)1運行編譯后的可執(zhí)

29、行文件,輸入用 PL/O的源語言寫的代碼文件integer.txt:該文件內(nèi)容如下:in teger w;beginin teger w:=25; write(w);en d.得到程序的運行結(jié)果如圖1所示:Input pl/0 f ile ? in t ege r.t xt List object code? <¥/N>y List snbol table?3integer v>;Il beg i nTAELE:±nt wleu =0 addi* =312write<w>;7end.1234567±nt lit sto lod opr

30、 opp opr000000025331415 0;t ai't25pl0圖1測試數(shù)據(jù)integer.txt的運行結(jié)果2、運行編譯后的可執(zhí)行文件,輸入用 PL/0的源語言寫的代碼文件character.txt:該文件內(nèi)容如下:character m; begincharacter m:=m;End.得到程序的運行結(jié)果如圖2所示:character r:- n :nput p1/0 f ilerchdracter.tKt 1st abject code? <¥xH>y 1st snba1 t«ble?icikarActer n;ABLE:chaisetei

31、- nlev-R Ad<h'H3key to continuc_3、運行編譯后的可執(zhí)行文件,輸入用 該文件內(nèi)容如下:PL/0的源語言寫的代碼文件double.txt:double m;begindouble m:=5.5;write(m);End.得到程序的運行結(jié)果如圖 3所示:Input pl/8 Filc?double List object code? <YzN>y Lise synbol tdble? (¥/N>y tldonblc n;IbelinTABLE:1 doubler nlew-0 addi*-32 double rt- -S .5 ;4 written);Vend*1 int 82 lit P 5-53 sto fl 34 lod B 35 opr 8 14 p a pi* B 15b opr fl 0ptirt pl0Press any

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論