編譯原理_詞法分析器_實(shí)驗(yàn)報(bào)告_第1頁
編譯原理_詞法分析器_實(shí)驗(yàn)報(bào)告_第2頁
編譯原理_詞法分析器_實(shí)驗(yàn)報(bào)告_第3頁
編譯原理_詞法分析器_實(shí)驗(yàn)報(bào)告_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余15頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、詞法分析器實(shí)驗(yàn)報(bào)告. .實(shí)驗(yàn)?zāi)康模涸O(shè)計(jì)、編制、調(diào)試一個(gè)詞法分析子程序識(shí)別單詞 . 加深對(duì)詞法分析原理的理解。功能描述 :該程序要實(shí)現(xiàn)的是一個(gè)讀單詞過程 . 從輸入的源程序中 . 識(shí)別出各個(gè)具有獨(dú)立意義的單詞 . 即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。(遇到錯(cuò)誤時(shí)可顯示“ Error !”. 然后跳過錯(cuò)誤部分繼續(xù)進(jìn)行)設(shè)計(jì)思想:設(shè)計(jì)該詞法分析器的過程中雖然沒有實(shí)際將所有的狀態(tài)轉(zhuǎn)移表建立出來 . 但是所用的思想是根據(jù)狀態(tài)轉(zhuǎn)移表實(shí)現(xiàn)對(duì)單詞的識(shí)別。首先構(gòu)造一個(gè)保留字表 , 然后, 每輸入一個(gè)字符就檢測(cè)應(yīng)該進(jìn)入什么狀態(tài) , 并將該字符連接到 d

2、串后繼續(xù)輸入 , 如此循環(huán) ,最后根據(jù)所在的接受狀態(tài)以及保留字表識(shí)別單詞。符號(hào)表:記號(hào) 類別 屬性值ws - -const 保留字 1var 保留字 1call 保留字 1begin 保留字 1if 保留字 1while 保留字 1do 保留字 1odd 保留字 1end 保留字 1. .then 保留字 1procedure 保留字 1= 運(yùn)算符 2< 運(yùn)算符 2<= 運(yùn)算符 2<> 運(yùn)算符 2> 運(yùn)算符 2>= 運(yùn)算符 2* 運(yùn)算符 2+ 運(yùn)算符 2- 運(yùn)算符 2/ 運(yùn)算符 2:= 運(yùn)算符 2ident 標(biāo)識(shí)符 3number 常數(shù) 4( 分隔符 5)

3、分隔符 5; 分隔符 5, 分隔符 5. 分隔符 5狀態(tài)轉(zhuǎn)換圖:標(biāo)識(shí)符及保留字:. .letter or digittStart letternumber:otherotherdigit digitdigitstart digit . digit E + | - digit 0 1 2 3 4 5 6E digit關(guān)系操作符:. .start < =(<=, 2)>(<>, 2)other*= (<,2)(=, 2)>:=(>=, 2)other*(>, 2) =(:=,2) 分隔符:; start( ; ,5)( (,5)( ),5) ,

4、.( , ,5)( . ,5). .算術(shù)運(yùn)算符:start +( + ,2)- ( -,2)*/( *,2)( / ,2)使用環(huán)境:Windows xp 下的 visual c+6.0程序測(cè)試:input1 :int a,b;a=b+2;input2:while(a>=0)do7x=x+6.7E+23;end;input3:begin:x:=9if x>0 then x:=x+1;while a:=0 dob:=2*x/3,c:=a;end;. .output1: 3,x 5,;3,int 2,+ 1,while3,a 4,6.7E+23 3,a5, 5,; 2,:=3,b 1,e

5、nd 4,05,; 5,; 1,do3,a 3,boutput3:2,= 2,:=1,begin3,b 4,2error line 12,+ 2,*3,x4,2 3,x2,:=5,; 2,/4,9 4,3output2: 1,if 5,1,while 3,x 3,c5,( 2,> 2,:=3,a 4,0 3,a2,>= 1,then 5,;4,0 3,x 1,end5,) 2,:= 5,;1,do 3,xerror line 3 2,+2,= 4,1測(cè)試結(jié)果與預(yù)期結(jié)果一致源程序代碼:#include<stdio.h>#include<string.h>voi

6、d main()int i=0,j,k=0,state=1,f=0,linenum=1;chara1110="const","var","call","begin","if","while","do","odd","end","then","procedure"char b,d40="0"freopen("input.txt","

7、;r",stdin);freopen("output.txt","w",stdout);b=getchar();while(b!=EOF)/* 判斷所輸入字符是否為結(jié)束符 */if(b=' '|b='n'|b='t')/* 濾過空格、換行等分隔符號(hào) */. . if(b='n') linenum+;b=getchar();else if(b>='a'&&b<='z')|(b>='A'&&

8、;b<='Z')/* 識(shí)別標(biāo)識(shí)符以及保留字 */di+=b;b=getchar();while(b>='a'&&b<='z')|(b>='A'&&b<='Z')|(b>='0'&&b<='9')di+=b;b=getchar();for(j=0;j<11;j+)/* 查詢保留字表確定該單詞是否是保留字 */ if(strcmp(d,aj)=0) printf("1,%sn&quo

9、t;,d);k=1;break;if(k=0)/* 在保留字表中沒有查到該單詞 . 是標(biāo)識(shí)符 */printf("3,%sn",d);for(j=0;j<=i;j+)dj='0'i=0;k=0;else if(b>='0'&&b<='9')/* 識(shí)別常數(shù) */ di+=b;b=getchar();while(f!=1)switch (state) case 1:if(b>='0'&&b<='9') state=1;di+=b;b=ge

10、tchar();else if(b='.') state=2;di+=b;b=getchar();else if(b='E') state=4;di+=b;b=getchar();else state=7;break;case 2:if(b>='0'&&b<='9') state=3;di+=b;b=getchar();else state=8;break;. .case 3:if(b>='0'&&b<='9') state=3;di+=b;b

11、=getchar();else if(b='E') state=4;di+=b;b=getchar();else state=7;break;case 4:if(b='+'|b='-') state=5;di+=b;b=getchar();else if(b>='0'&&b<='9') state=6;di+=b;b=getchar();else state=8;break;case 5:if(b>='0'&&b<='9') s

12、tate=6;di+=b;b=getchar();else state=8;break;case 6:if(b>='0'&&b<='9') state=6;di+=b;b=getchar();else state=7;break;case 7: f=1;break;case 8: f=1;break;if(state=7&&(b<'a'|b>'z')&&(b<'A'|b>'Z')printf("4,%sn&

13、quot;,d);else if(state=7&&(b>='a'&&b<='z')|(b>='A'&&b<='Z')/* 數(shù)字后接字母的出錯(cuò)控制*/while(b>='a'&&b<='z')|(b>='A'&&b<='Z') di+=b;b=getchar();printf("error line %dn",linenu

14、m);else printf("error line %dn",linenum);for(j=0;j<=i;j+)dj='0'i=0;f=0;state=1;else if(b='<')/* 識(shí)別'<' 、'<=' 和'<>'*/ di+=b;b=getchar();if(b='='|b='>'). . di+=b;b=getchar();printf("2,%sn",d);for(j=0;j<=

15、i;j+)dj='0'i=0;else printf("2,%sn",d);for(j=0;j<=i;j+)dj='0'i=0;else if(b='>')/* 識(shí)別'>' 和'>='*/ di+=b;b=getchar();if(b='=') di+=b;b=getchar();printf("2,%sn",d);for(j=0;j<=i;j+)dj='0'i=0;else printf("2,%sn&

16、quot;,d);for(j=0;j<=i;j+)dj='0'i=0;else if(b=':')/* 識(shí)別':='*/ di+=b;b=getchar();if(b='=') di+=b;b=getchar();printf("2,%sn",d);else printf("error line %dn",linenum);for(j=0;j<=i;j+)dj='0'i=0;else if(b='*'|b='+'|b='-&

17、#39;|b='/'|b='=')/* 識(shí)別運(yùn)算符 */. . printf("2,%cn",b);b=getchar();else if(b='('|b=')'|b=','|b=''|b='.')/* 識(shí)別分隔符 */ printf("5,%cn",b);b=getchar();else printf("error line %dn",linenum);b=getchar();實(shí)驗(yàn)心得:此次實(shí)驗(yàn)讓我了解了如何設(shè)計(jì)、編制并調(diào)試詞法分析程序 . 并加深了我對(duì)詞法分 析器原理的理解;熟悉了直接構(gòu)造詞法分析器的方法和相關(guān)原理 . 并學(xué)會(huì)使用 c 語言直接編寫詞法分析器;同時(shí)更熟練的掌握用 c 語言編寫程序 . 實(shí)現(xiàn)一定的實(shí)際功 能。歡迎您的 光臨, Word 文 檔下載 后可修 改編輯 雙擊 可刪除 頁眉頁 腳 謝謝 !希望 您提出 您寶貴 的意見 ,你的 意見

溫馨提示

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

評(píng)論

0/150

提交評(píng)論