詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)試驗(yàn)報告文檔_第1頁
詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)試驗(yàn)報告文檔_第2頁
詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)試驗(yàn)報告文檔_第3頁
詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)試驗(yàn)報告文檔_第4頁
詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)試驗(yàn)報告文檔_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)實(shí)驗(yàn)報告變更說明日期版本變更位置變更說明作者2014/4/91.0初稿生成房皓2014/4/91.0完善截稿房皓、實(shí)驗(yàn)?zāi)康?本實(shí)驗(yàn)的U的在于在教師的引導(dǎo)下以問題回朔與思維啟發(fā)的方式,使學(xué)生在 不斷的探究過程中掌握編譯程序設(shè)計和構(gòu)造的基本原理和實(shí)現(xiàn)技術(shù),啟迪學(xué)生的 抽象思維、激發(fā)學(xué)生的學(xué)習(xí)興趣、培養(yǎng)學(xué)生的探究精神和專業(yè)素養(yǎng),從而提高學(xué) 生發(fā)現(xiàn)問題、分析問題和解決問題的能力。二、實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)項(xiàng)口完成以下正則文法所描述的Pascal語言子集單詞符號的詞法分析 程序。標(biāo)識符f字母I標(biāo)識符字母I標(biāo)識符數(shù)字無符號整數(shù)數(shù)字I無符號整數(shù)數(shù)字單字符分界符一+丨一丨*丨;丨(丨)雙

2、字符分界符f大于二I小于二I小于 I冒號二I斜豎*小于f 等于大于f冒號一:斜豎一/該語言的保留字:begin end if then else for do while and or not設(shè)計說明(1)該語言大小寫不敬感;(2)字母為a-z A-Z,數(shù)字為0-9; (3) 可以對上述文法進(jìn)行擴(kuò)充和改造;(4)'/*/'為程序的注釋部分。設(shè)計要求(1)給出各單詞符號的類別編碼;(2)詞法分析程序應(yīng)能發(fā)現(xiàn)輸 入串中的錯誤;(3)詞法分析作為單獨(dú)一遍編寫,詞法分析結(jié)果為二元式序列 組成的中間文件;(4)設(shè)計兩個測試用例(盡可能完備),并給出測試結(jié)果。三、實(shí)驗(yàn)環(huán)境:操作系統(tǒng):Win

3、dows 7軟件: VC+6.0四、程序功能描述:給出了各單詞符號的類別編碼;詞法分析程序能夠?qū)o出的文件中的輸入串做出正確的詞法;詞法分析程序能發(fā)現(xiàn)文件輸入串中的錯誤;詞法分析結(jié)果為二元式序列組成的中間文件;詞法分析程序能兼容注釋并能發(fā)現(xiàn)文件注釋未關(guān)閉的錯誤五、數(shù)據(jù)結(jié)構(gòu)設(shè)計:char T0KEN20;FILE *Fp_out=fopenC'result. txt",11 w11); char ch;intint zhushi=O;cti=Fgetc(fp);六、程序結(jié)構(gòu)描述:設(shè)計方法:本程序采用從文件讀取字符串,根據(jù)已有文法、詞法的構(gòu)成及規(guī)定對字 符串進(jìn)行詞法分析,其種類主

4、要包括保留字.標(biāo)識符、無符號數(shù)字、字符等, 將分析的結(jié)果寫入另一個文件。程序規(guī)定的單詞符號及其種別碼見下表:單詞符號及其種別碼表單詞符號種別碼單詞符號種別碼begin1無符號整數(shù)13end2+14If3-15then4*16else517for6(18do7)19whileX=20and9>21or10>=22not11<23標(biāo)識符12<=24<>25 26/27/*28引29主要函數(shù)說明:匚麗 cffx classesEi tSGIobalsQ lookup (char *strj 金 mainOQ scannerJFILE *fp)lookupO:每調(diào)用

5、一次,就以TOKEN中的字符串查保留字表,若查到,就將 相應(yīng)關(guān)鍵字的類別碼賦給整型變量C;否則將c置為0;main():主函數(shù);scanner():掃描函數(shù),完成程序的主要功能,包括讀字符串、分析處理、分 析處理等。函數(shù)調(diào)用關(guān)系說明:main()函數(shù)調(diào)用scanner()函數(shù); scanner()函數(shù)調(diào)用lookupO函數(shù)。執(zhí)行框圖:1)總體結(jié)構(gòu)圖:是2)掃描程序結(jié)構(gòu)框圖:七、實(shí)驗(yàn)過程結(jié)果截圖:inputtxt -記亙本CD | 回'文件(F)編牽(E)艷武(0)查看(V)密為(H)Iasdf 1234 a 4 < > <> ( ; tt*/*dfakldfj*

6、/ >=dfa1結(jié)果一:result.txt - F辜本a回文性®鋌(C)梧式(0) g§iV)辛助(H)蕩魂«®算強(qiáng)嚴(yán)J叫»(13, 0 (K,;)(非法字符,忙皿樹,/)測試用例二:文件(F)矚詢町格式(O) “(V)毎劉(H)123 2 asdf w ;678 (dfer) if then A888/ Ajff結(jié)果二:d result.brt13事本!上旦宣旦魁文性(F)編垢懺(6 EM辛助(H)(13,123) (13,2) (12, asdf) (12, w) (17,;) (13, 678) (18, 0 (12, dfer)

7、 (19, ) (3, if) (4, then) (28, /*)(程 序有錯誤,注釋沒有關(guān)閉I )八、實(shí)驗(yàn)總結(jié):實(shí)驗(yàn)心得:通過本次實(shí)驗(yàn)我鍛煉了自己的上機(jī)操作能力及編程能力,并對理論知識有了 進(jìn)一步的了解。本實(shí)驗(yàn)基本思路比較清晰,用較為簡單的算法就能實(shí)現(xiàn);解 決實(shí)驗(yàn)中遇到的問題也花費(fèi)了一部分時間,我增長了處理關(guān)于文件錯誤的能 力;實(shí)驗(yàn)中遇到的問題:主要問題就是在讀取文件時對文件末尾的判斷預(yù)處理,有兩個問題花費(fèi)了大 部分時間,一個是在回退時要判斷是否為文件末尾,若是則不需要回退;另 外一個就是要先讀取一個字符再用feof(fp)來判斷是否為文件尾,且兩個應(yīng) 緊密相連;程序的自我評價:此程序?qū)崿F(xiàn)

8、了要求中的所有功能,并增加了對注釋的一些操作,但因編程能 力的欠缺,其中有的地方不免有些繁雜,還有一些潛藏的問題,需要進(jìn)一步 測試來時程序變得更加具有健壯性。九、程序清單:/* *$*$*$*課題名稱:詞法分析程序構(gòu)造原理與實(shí)現(xiàn)技術(shù)作者:房皓進(jìn)修生13410801最后修改時間:2014.4.9 19:47*/* * * * * *$* * 單詞符號及 其分類編碼單詞符號種別碼單詞符號種別碼begin1無符號整數(shù)13end2+14if3-15then4*16else5;17for6(18do7)19while8=20and9>21or10>=22not11<23標(biāo)識符12<

9、;=24o25 26/27/*28*/29/*$*奪*$* */#include<iostream> #include<ctype.h>#include<string.h>#include<stdlib.h> using namespace std;/int look叩(char *str)每調(diào)用一次,就以TOKEN中的字符串查保留字表,若查到,就將相應(yīng) 關(guān)鍵字的類別碼賦給整型變量c:否則將c宜為0char*letter 11 = "begin","end","else","f

10、or","do”,"while","and","or", "not" -JI 保留 字int i;for(i=0;i<ll;i+)(if(strcmp(strJetteri)=O)比較是否相同return i+1;若相同,返回相應(yīng)的種別碼return 0;/ int scanner(FILE *fp) charTOKEN20;FILE *fp_out=fopen(Mresult.txtn;,wH); char ch;int i=O,c;int zhushi=O;前不是注釋,zhushi=l

11、表示當(dāng)前及以后的都是注釋 ch=fgetc(fp);while(!feof(fp)if(zhushi=O)i=0;if(ch=7lch=' )elseif(isalpha(ch)ch=tolower(ch);TOKEN0=ch;i+;ch=fgetc(fp);while(isalnum(ch)(if(isalpha(ch)ch=tolower(ch);TOKENi=ch;i+; ch=fgetc(fp);TOKENiW;if(ch!=EOF) 此判斷,遇到文件結(jié)尾仍返回的話,則 fseek(fp,-lL.l); 最后一個字符c=lookup(TOKEN):if(c=O)fprintf(

12、fp_out;,(%d,%s),12.TOKEN); printf("(%d,%s)n'15JOKEN);elsefprintf(fp_out;,(%d,%s),c.TOKEN); printf(,(%d,%s)n,c,TOKEN);/zhushi等于0表示當(dāng)/判斷文件結(jié)朿是否為字母轉(zhuǎn)換成小寫數(shù)字或字母經(jīng)驗(yàn)證,若沒有/ch的值永遠(yuǎn)為文件查找保留字/標(biāo)識符/標(biāo)識符/保留字/保留字else是否為數(shù)字if(isdigit(ch)TOKEN0=ch; ch=fgetc(fp);i卄;while(isdigit(ch)TOKENi=ch;i+;ch=fgetc(fp);)TOKENi=

13、0,; if(ch!=EOF)fseek(fp,-lL.l);fprintf(fp_out;,(%d.%s), 13 .TOKEN);無符號整數(shù)printf(,(%d,%s)n, 16.TOKEN);無符號整數(shù)elseswitch(ch)casek1:if(!feof(fp)ch=fgetc(fp);if(ch=,= )printf(H(%d,%s)n,24;,<=,r);elseif(ch=,>,)fprintf(fp_out/,(%d,%s),25;,<>H); printf(H(%d)%s)n,25;,oN);elseif(ch!=EOF)fscck(fp,l,l

14、);fprintf(fp_out/,(%d,%c),23;<,); printf(H(%d,%c)n,23;<r):break:case=*: fprintf(fp_out;,(%d,%c),20/=,); printf(,'(%d,%c)nH,20?=1);break;case、':if(!feof(fp) ch=fgetc(fp);if(ch=,)fprintf(fp_out;,(%d,%s)N22?,=H); primf(”(d,%s)n”,22,”);)elseif(ch!=EOF)fseek(fprLl); fprintf(fp_out;,(%d,%c),

15、21 A); printf(H(%d,%c)n,21;,);break;caseV:fprintf(fp_out;,(%d,%c),l 4,屮); printf(,'(%d,%c)n',t14,+,);)break:case-1:fprintf(fpout;,(%d,%c), 15,r);primf(”(d,%c)n”5,);break;case1*:fprintf(fp_out;,(%d,%c), 16/*1); printfC(%d,%c)n”,16 嚴(yán));)break;case:':fprintf(fp_out;,(%d,%c),J 7,:');primf

16、(”(d,%c)n”J7,');break:caseV: fprintf(fp_out;,(%d,%c), 1 &'(');printf(H(%d,%c)nM8:(,);break;case1/: fprintf(fp_out;,(%d,%c), 19 J)'); printf(H(%d,%c)nM9,T);)break;case/:if(!feof(fp) ch=fgetc(fp);if(ch=w)zhushi=l;/zhushi=l;fprintf(fp_out;,(%d,%s),28;7*H); printf(H(%d,%s)n,28:,/*H);

17、)else if(ch!=EOF) fseek(fprLl);fprimf(fp_ou(d,%cy;27,7); primf("(%d,%c)n”,27,7);break:case?:if(!feof(fp) ch=fgetc(fp);if(ch=r) fprimf(fp_ou(d,%s)”,26=J; printf(M(%d,%s)n,26:,:=M);)else if(ch!=EOF) fseek(fp,-lj);break;default: fprimf(fp_ou(s,%c)T 非法字符 ch); printf(“ (s,%c)n","非法字符",ch); break;ch=fgetc(fp);if(zhushi= 1)該部分為檢査注釋是否結(jié)束,若結(jié)束,則令shuzhi=O;if(ch=,*')if(!feof(fp)ch=fgetc(fp);if(ch=7r)fprimf(fp_ou(s,%s)T 注釋結(jié)束 丁叨); prin

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論