試驗(yàn)一手工編寫簡單詞法分析程序_第1頁
試驗(yàn)一手工編寫簡單詞法分析程序_第2頁
試驗(yàn)一手工編寫簡單詞法分析程序_第3頁
試驗(yàn)一手工編寫簡單詞法分析程序_第4頁
試驗(yàn)一手工編寫簡單詞法分析程序_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、編譯原理實(shí)驗(yàn)報(bào)告日期:班級:_題目:組員:1實(shí)驗(yàn)?zāi)康募耙?通過設(shè)計(jì)、編寫、調(diào)試一個(gè)具體的詞法分析程序,加深對詞法分析原理的理解。.掌握在對程序設(shè)計(jì)語言源程序進(jìn)行掃描的過程中,將其分解為各類單詞的詞法分析方法。2實(shí)驗(yàn)平臺Windows + VC + Win32 Console3實(shí)驗(yàn)步驟.查詢資料,了解詞法分析器的工作過程與原理。.分析題目,整理出基本設(shè)計(jì)思路。.實(shí)踐編碼,將設(shè)計(jì)思想轉(zhuǎn)換用c語言編碼實(shí)現(xiàn),編譯運(yùn)行。.測試功能,多次設(shè)置包含不同字符,關(guān)鍵字的待解析文件,仔細(xì)察看運(yùn)行結(jié)果,檢測該分析器的分析結(jié)果是否正確。通過最終的測試發(fā)現(xiàn)問題,逐漸完善代碼中設(shè)置的分析對象與關(guān) 鍵字表,拓寬分析范圍提

2、高分析能力。4 實(shí)驗(yàn)內(nèi)容實(shí)現(xiàn)下述功能,并將分析結(jié)果保存在文件中.(既可以參考范例程序,也可以獨(dú)立完成)程序輸入/輸出示例:輸入一段C語言程序,識別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識符、常數(shù)、運(yùn)算符、界符。(遇到錯(cuò)誤時(shí)可顯示“ Error”,然后跳過錯(cuò)誤部分繼續(xù)顯示)輸入源程序示例:main ()(int a , b =10;int c ;c = a + b * 20;)保留字表2輸出固定表格如下單詞類別表單詞類型單詞種別標(biāo)識符1保留字2常量3運(yùn)算符4分界符5運(yùn)算符表4算符地址指針+1一2*3/4=5保留字地址指針int1float2mag界符(35printf 界符4地址指針y IT

3、 匕 J -1 | J |_| V |11;2(3)4(5輸出動(dòng)態(tài)表格如下標(biāo)識符表1常量表3標(biāo)識符地址指針a1b2c3常量地址指針101202符號表單詞名稱類別地址指針int21c13;52c13=45a11單詞名稱類別地址指針+41int21b12c13*43;522032c13;52=45a11+41b12*432032;52)56程序:#include#include#include#include/定義關(guān)鍵字char *Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch;/存儲識別出的單詞流int Is

4、Alpha(char c) /判斷是否為字母if(c=a)|(c=A) return 1;else return 0;int IsNum(char c)/判斷是否為數(shù)字if(c=0&c=9) return 1;else return 0;int IsKey(char *Word)/ 識別關(guān)鍵字函數(shù)int m,i;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0)return 2;else return 1;return 0;void scanner(FILE *fp)/掃描函數(shù)char Word20=0;char ch;int i,c;ch=fgetc

5、(fp);/獲取字符,指針fp并自動(dòng)指向下一個(gè)字符if(IsAlpha(ch)/判斷該字符是否是字母Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)|IsAlpha(ch)/判斷該字符是否是字母或數(shù)字Wordi=ch;i+;ch=fgetc(fp);Wordi=0;/0 代表字符結(jié)束(空格)fseek(fp,-1,1);/回退一個(gè)字符c=IsKey(Word);/判斷是否是關(guān)鍵字if(c=0) printf(ttAnMtK %stt 1t 1ttn,Word);/不是關(guān)鍵字else if(c=2)printf(tt |nW%stt 2t 3ttn,Word);

6、 elseprintf(tt |ng%stt 3t 1ttn,Word); /輸出關(guān)鍵字else/開始判斷的字符不是字母if(IsNum(ch)/判斷是否是數(shù)字Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)Wordi=ch; i+; ch=fgetc(fp);)Wordi=0;fseek(fp,-1,1);/ 回退printf(tt |nttH %stt 3t 1ttn,Word);)else/開始判斷的字符不是字母也不是數(shù)字Word0=ch;switch(ch)case:printf(tt|nttT %stt5t7ttn,Word); break;case

7、:printf(tt|nttT %stt5t9ttn,Word); break;case(:printf(tt|nttT %stt5t3ttn,Word); break;case):printf(tt|nttT %stt5t4ttn,Word); break;case:printf(tt|nttT %stt5t5tt n,Word); break;case:printf(tt6tt n,Word); break;case,:pnntf(tt1tt n,Word); break;case:printf(ttAnW5t8tt n,Word); break;case;:pnntf(tt2tt | n

8、,Word); break;case+:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt 珀珀H %stt4t 6ttn,Word);/運(yùn)算符+=)else if(ch=+)printf(tt%stt4t 6tt n,Word);/判斷結(jié)果為+)else fseek(fp,-1,1);printf(tt%stt4t 1tt n,Word);/判斷結(jié)果為+)break;case-:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt |dntH %stt4t6tt n,Word); else if(ch=-)printf(tt |ntt %st

9、t4t6tt n,Word); /判斷結(jié)果為-else fseek(fp,-1,1);printf(tt |ntt %stt4t2tt n,Word); /判斷結(jié)果為-break;case*:printf(tt|Hntt %stt 4t3tt n,Word);break;case/:printf(tt|Hntt %stt 4t4tt n,Word);break;case!: case ,=:ch=fgetc(fp);if(ch=) printf(ttntt%stt 4t 6tt n,Word);)else fseek(fp,-1,1);printf(tt%stt4t 5tt n,Word);)

10、break;case:ch=fgetc(fp);Word1=ch;if(ch=) printf(tt ntt%stt 4t 6tt n,Word);/判斷結(jié)果為運(yùn)算符=)else if(ch=)printf(tt%stt4t 6ttn,Word);/判斷結(jié)果為) else fseek(fp,-1,1);printf(tt 珀珀H %stt4t 6tt n,Word);/判斷結(jié)果為:ch=fgetc(fp);Word1=ch;if(ch=)printf(tt |11ntt %stt 4t 6tt n,Word);else fseek(fp,-1,1);printf(ttntt%stt 4t 6t

11、t n,Word);)break;case%:ch=fgetc(fp);Word1=ch;if(ch=) printf(tt ntt | %stt |4t 16tt |n,Word);if(lsAlpha(ch) printf(tt ntt %st 類型標(biāo)識符 t t n,Word);else fseek(fp,-1,1);printf(tt nWH%s t取余運(yùn)算符t tn,Word); )break;default:printf(ttntt| 無法識另U字符! ttttn); break;) ) )main()(char in_fn30;/ 文件路徑FILE *fp;printf(n請輸入

12、源文件名(包括路徑和后綴名):”);while(true)gets(in_fn);/scanf(%s,in_fn);if(fp=fopen(in_fn,r)!=NULL) break; /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符else printf(文件路徑錯(cuò)誤!請重新輸入:);printf(n*單詞類別表*n);printf(tt ntt 單詞類型 t單詞種別 t n,Word);printf(tt 卜nttT 1標(biāo)識符t 1tn,Word);printf(tt 卜nttT 1保留字t 2tn,Word);printf(tt 卜nttT 1常量t 3tn,Word);pri

13、ntf(tt |ntH 運(yùn)算符 t 4 t n,Word);printf(tt |AntH I 分界符t 5t n,Word);printf(ttprintf(n*保留字表*n);An,WOrd);printf(tt nttn保留字t 地址指針tn,Word);printf(tt 卜nttH lintt 1tn,Word);printf(tt 卜nttT floatt 2tn,Word);printf(tt 卜nttT maint 3t n,Word);printf(tt 卜nttT printft 4tn,Word);printf(tt L n,Wdrd);*printf(n*n);運(yùn)算符表

14、printf(tt ntt川算符ttn,Word);printf(tt 卜ntt一t1tn,Word);printf(tt 卜ntt1 t2tn,Word);printf(tt 卜ntt力*t3tn,Word);printf(tt 卜/t 4t n,Word);printf(tt 卜ntt=t 5t n,Word);printf(tt 卜11 其他t 6t n,Word);printf(tt LrWrd);*printf(tt n 1界符t地址指針tn,Word);printf(tt 卜t1tn,Word);printf(tt 卜HI ;t2tn,Word);printf(tt 卜Hl(t3t

15、n,Word);printf(tt 卜HI)t4tn,Word);printf(tt 卜Hlt5tn,Word);printf(tt 卜HIt6tn,Word);printf(tt LrWrd);printf(nprintf(n*詞 法 分 析 結(jié) 果 如 下*printf(tt nWh 單詞名稱 t | 類別t 1 地址指針 tn,Word);doch=fgetc(fp);文件以#結(jié)尾,作為掃描結(jié)束條件if(ch=#) break;忽略空格,空白,和換行else if(ch= |ch=t|ch=n) /elsefseek(fp,-1,1);/回退一個(gè)字節(jié)開始識別單詞流scanner(fp);

16、while(ch!=#);printf(ttAn,Word);return(0);5實(shí)驗(yàn)結(jié)果5.1解析源文件:main ( )int a , b =10;int c ;c = a + b * 20;5.2解析結(jié)果:I心口5叫為期四。中端(1 1I.燙 T * D:x iaobiriDe bugill.exe*卜i1E卜b1=451031S 9S2士n七31C119b2C11=.4a11+41b11433152y56Pi*ss Any Hcey to cnntiniie6實(shí)驗(yàn)總結(jié)分析在本次實(shí)驗(yàn),使我們再次瀏覽了有關(guān)c語言的一些基本知識,特別是對文件,字符串進(jìn)行基本操作的方法。C語言中沒有string類型,因此本實(shí)驗(yàn)中的對字符串提取與識別均借助#include及字符型數(shù)組來實(shí)現(xiàn)。讓我們練習(xí)對字符串函數(shù)應(yīng)用的同時(shí)也提高了自己的邏輯思維能力。在本次實(shí)驗(yàn)中,我糾正了一個(gè)一直以來的概念錯(cuò)誤:main不是關(guān)鍵字,它定義為程序的入口,是主函數(shù)!在本實(shí)驗(yàn)中

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論