編譯原理詞法分析和語(yǔ)法分析報(bào)告 代碼(C語(yǔ)言版)_第1頁(yè)
編譯原理詞法分析和語(yǔ)法分析報(bào)告 代碼(C語(yǔ)言版)_第2頁(yè)
編譯原理詞法分析和語(yǔ)法分析報(bào)告 代碼(C語(yǔ)言版)_第3頁(yè)
編譯原理詞法分析和語(yǔ)法分析報(bào)告 代碼(C語(yǔ)言版)_第4頁(yè)
編譯原理詞法分析和語(yǔ)法分析報(bào)告 代碼(C語(yǔ)言版)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 詞法分析一、 實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。二、 實(shí)驗(yàn)要求2.1 待分析的簡(jiǎn)單的詞法(1)關(guān)鍵字: begin if then while do end所有的關(guān)鍵字都是小寫。(2)運(yùn)算符和界符: = + - * / = = = ; ( ) #(3)其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過(guò)以下正規(guī)式定義:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕?lái)分隔ID、SUM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼:表2

2、.1 各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼 單詞符號(hào)種別碼bgin1:17If2:=18Then320wile421do523lettet(letter|digit)*10=24dight dight*11=25+13;2614(27*15)28/16#02.3 詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼; token為存放的單詞自身字符串; sum為整型常數(shù)。例如:對(duì)源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,經(jīng)過(guò)詞法分析后輸出如下序列:(1,begin

3、)(10,x)(18,:=)(11,9)(26,;)(2,if)三、詞法分析程序的算法思想:算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。3.1 主程序示意圖:主程序示意圖如圖3-1所示。其中初始包括以下兩個(gè)方面: 關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = “begin”, “if”, “then”,

4、 “while”, “do”, “end”,;置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束 否 是結(jié)束 圖3-1(2)程序中需要用到的主要變量為syn,token和sum3.2 掃描子程序的算法思想:首先設(shè)置3個(gè)變量:token用來(lái)存放構(gòu)成單詞符號(hào)的字符串;sum用來(lái)整型單詞;syn用來(lái)存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖3-2所示。變量初始化忽略空格是否文件結(jié)束? 返回 是 是否字母拼字符串 數(shù)字 其他運(yùn)算符、 符號(hào)界符等符號(hào)是否關(guān)鍵字?返回拼數(shù) 否對(duì)不同符號(hào)給出相應(yīng)的syn值報(bào)錯(cuò)syn=10 是syn=1111syn為對(duì)應(yīng)關(guān)鍵字的單詞種別碼圖 3-2四、詞法分析程序的C語(yǔ)言程序

5、源代碼:#include #include char prog80,token8,ch;int syn,p,m,n,sum;char *rwtab6=begin,if,then,while,do,end; scaner();main()p=0; printf(n please input a string(end with #):/n); do scanf(%c,&ch); progp+=ch; while(ch!=#); p=0; do scaner(); switch(syn) case 11:printf( %-10d%5d )n,sum,syn); break; case -1:pri

6、ntf(you have input a wrong stringn); getch(); exit(0); default: printf( %-10s%5d )n,token,syn); break; while(syn!=0); getch(); scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; ch=progp+; m=0; while(ch= )|(ch=n)ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; syn=10;

7、for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0; ch=progp+; p-; syn=11; else switch(ch) case :tokenm+=ch; ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=23; p-; break; case +: tokenm+=ch; ch=progp+; if(ch=+) syn=17; tokenm+=ch; else syn=13; p-; break; case -:tokenm+=ch; ch=progp+; if(ch=-) syn=29; token

8、m+=ch; else syn=14; p-; break; case !:ch=progp+; if(ch=) syn=21; tokenm+=ch; else syn=31; p-; break; case =:tokenm+=ch; ch=progp+; if(ch=) syn=25; tokenm+=ch; else syn=18; p-; break; case *: syn=15; tokenm+=ch; break; case /: syn=16; tokenm+=ch; break; case (: syn=27; tokenm+=ch; break; case ): syn=

9、28; tokenm+=ch; break; case : syn=5; tokenm+=ch; break; case : syn=6; tokenm+=ch; break; case ;: syn=26; tokenm+=ch; break; case : syn=30; tokenm+=ch; break; case #: syn=0; tokenm+=ch; break; case :syn=17; tokenm+=ch; break; default: syn=-1; break; tokenm+=0; 五、結(jié)果分析:輸入begin x:=9: if x9 then x:=2*x+1

10、/3; end # 后經(jīng)詞法分析輸出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如圖5-1所示: 圖5-1六、總結(jié):詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。通過(guò)本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。 語(yǔ)法分析一、 實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)遞歸下降分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列的語(yǔ)法檢查和結(jié)構(gòu)分析。二、 實(shí)驗(yàn)要求利用C語(yǔ)言編制遞歸下降分析程序,并對(duì)簡(jiǎn)單語(yǔ)言進(jìn)行語(yǔ)法分析。2.1 待分析的簡(jiǎn)單語(yǔ)言的語(yǔ)法用擴(kuò)充的BNF表示如下:=be

11、ginend:=;:=:=ID:=:=+ | -:=* | /:=ID | NUM | ()2.2 實(shí)驗(yàn)要求說(shuō)明輸入單詞串,以“#”結(jié)束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如: 輸入 begin a:=9; x:=2*3; b:=a+x end # 輸出 success! 輸入 x:=a+b*c end # 輸出 error2.3 語(yǔ)法分析程序的酸法思想(1)主程序示意圖如圖2-1所示。置初值調(diào)用scaner讀下一個(gè)單詞符號(hào)調(diào)用lrparser結(jié)束圖2-1 語(yǔ)法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2-2所示。(3)語(yǔ)句串分析過(guò)程

12、示意圖如圖2-3所示。 是否begin?調(diào)用statement函數(shù)否是是否 ;?調(diào)用scaner否調(diào)用語(yǔ)句串分析程序是 調(diào)用scaner是否end? 否調(diào)用statement函數(shù)是調(diào)用scaner出錯(cuò)處理syn=0&kk=0?否 圖2-3 語(yǔ)句串分析示意圖 是 打印分析成功出錯(cuò)處理 圖2-2 遞歸下降分析程序示意圖 (4)statement語(yǔ)句分析程序流程如圖2-4、2-5、2-6、2-7所示。調(diào)用term函數(shù)是否標(biāo)識(shí)符?否調(diào)用expression函數(shù)調(diào)用scaner是否:=?調(diào)用scaner是否+ , -?否否是調(diào)用scaner調(diào)用term函數(shù)出錯(cuò)處理出錯(cuò)處理圖2-4 statement語(yǔ)句

13、分析函數(shù)示意圖 圖2-5 expression表達(dá)式分析函數(shù)示意圖調(diào)用scaner調(diào)用factor函數(shù)出錯(cuò)處理是否* , /?調(diào)用factor函數(shù)是否標(biāo)識(shí)符?是否否是否整常數(shù)?是是否是否(?否是調(diào)用scaner是否)?調(diào)用expression函數(shù)圖 2-6 term分析函數(shù)示意圖否出錯(cuò)處理調(diào)用scaner調(diào)用scaner是圖2-7 factor分析過(guò)程示意圖三、 語(yǔ)法分析程序的C語(yǔ)言程序源代碼:#include stdio.h#include string.hchar prog100,token8,ch;char *rwtab6=begin,if,then,while,do,end;int s

14、yn,p,m,n,sum;int kk;factor();expression();yucu();term();statement();lrparser();scaner();main()p=kk=0;printf(nplease input a string (end with #): n);do scanf(%c,&ch); progp+=ch; while(ch!=#);p=0;scaner();lrparser();getch();lrparser()if(syn=1) scaner(); /*讀下一個(gè)單詞符號(hào)*/ yucu(); /*調(diào)用yucu()函數(shù);*/ if (syn=6)

15、scaner(); if (syn=0)&(kk=0) printf(success!n); else if(kk!=1) printf(the string havent got a end!n); kk=1; else printf(havent got a begin!n);kk=1; return;yucu() statement(); /*調(diào)用函數(shù)statement();*/ while(syn=26) scaner(); /*讀下一個(gè)單詞符號(hào)*/ if(syn!=6) statement(); /*調(diào)用函數(shù)statement();*/ return;statement() if(s

16、yn=10) scaner(); /*讀下一個(gè)單詞符號(hào)*/ if(syn=18) scaner(); /*讀下一個(gè)單詞符號(hào)*/ expression(); /*調(diào)用函數(shù)statement();*/ else printf(the sing := is wrong!n); kk=1; else printf(wrong sentence!n); kk=1; return;expression() term(); while(syn=13)|(syn=14) scaner(); /*讀下一個(gè)單詞符號(hào)*/ term(); /*調(diào)用函數(shù)term();*/ return;term() factor();

17、 while(syn=15)|(syn=16) scaner(); /*讀下一個(gè)單詞符號(hào)*/ factor(); /*調(diào)用函數(shù)factor(); */ return;factor() if(syn=10)|(syn=11) scaner(); else if(syn=27) scaner(); /*讀下一個(gè)單詞符號(hào)*/ expression(); /*調(diào)用函數(shù)statement();*/ if(syn=28) scaner(); /*讀下一個(gè)單詞符號(hào)*/ else printf(the error on (n); kk=1; else printf(the expression error!n

18、); kk=1; return;scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; m=0; ch=progp+; while(ch= )ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=progp+; p-; syn=10; tokenm+=0; for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0; ch=progp+;p-;syn=11; else switch(ch) case ) syn=21; else if(ch=

19、) syn=22; else syn=20; p-; break; case :m=0; ch=progp+; if(ch=) syn=24; else syn=23; p-; break; case :m=0; ch=progp+; if(ch=) syn=18; else syn=17; p-; break; case +: syn=13; break; case -: syn=14; break; case *: syn=15;break; case /: syn=16;break; case (: syn=27;break; case ): syn=28;break; case =:

20、syn=25;break; case ;: syn=26;break; case #: syn=0;break;default: syn=-1;break; 四、 結(jié)果分析:輸入 begin a:=9; x:=2*3; b:=a+x end # 后輸出success! 如圖4-1所示:圖4-1輸入 x:=a+b*c end # 后輸出 error 如圖4-2所示:圖4-2五、 總結(jié):通過(guò)本次試驗(yàn),了解了語(yǔ)法分析的運(yùn)行過(guò)程,主程序大致流程為:“置初值”調(diào)用scaner函數(shù)讀下一個(gè)單詞符號(hào)調(diào)用IrParse結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”不是則“出錯(cuò)處理”,若是則“調(diào)用s

21、caner函數(shù)”調(diào)用語(yǔ)句串分析函數(shù)“判斷是否為end”不是則“出錯(cuò)處理”,若是則調(diào)用scaner函數(shù)“判斷syn=0&kk=0是否成立”成立則說(shuō)明分析成功打印出來(lái)。不成立則“出錯(cuò)處理”。語(yǔ)義分析程序#include stdio.h#include string.hchar prog100,token8,ch;char *rwtab6=begin,if,then,while,do,end;int syn,p,m,n,sum,q;int kk;struct char result18; char ag118; char op18; char ag218; quad20;char *factor()

22、;char *expression();int yucu();char *term();int statement();int lrparser();char *newtemp();scaner();emit(char *result,char *ag1,char *op,char *ag2);main() int j;q=p=kk=0;printf(nplease input a string (end with #): );do scanf(%c,&ch); progp+=ch; while(ch!=#);p=0;scaner();lrparser();if(q19)printf( to

23、long sentense!n);else for (j=0;jq;j+)printf( %s = %s %s %s nn,quadj.result1,quadj.ag11,quadj.op1,quadj.ag21);getch();int lrparser() int schain=0; kk=0; if (syn=1) scaner();schain=yucu();if(syn=6) scaner(); if(syn=0)&(kk=0) printf(Success!n); else if(kk!=1)printf(short of end !n); kk=1; getch(); exit

24、(0); else printf(short of begin !n); kk=1; getch(); exit(0); return (schain);int yucu() int schain=0; schain=statement(); while(syn=26) scaner(); schain=statement(); return (schain);int statement() char tt8,eplace8; int schain=0; if (syn=10) strcpy(tt,token); scaner(); if(syn=18) scaner(); strcpy(ep

25、lace,expression(); emit(tt,eplace,); schain=0; else printf(short of sign := !n); kk=1; getch(); exit(0); return (schain); char *expression() char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12); strcpy(eplace,term(); while(syn=13)

26、|(syn=14) if (syn=13)strcpy(tt,+); else strcpy(tt,-); scaner(); strcpy(ep2,term(); strcpy(tp,newtemp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); return (eplace);char *term() char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12);

27、strcpy(eplace,factor(); while(syn=15)|(syn=16) if (syn=15)strcpy(tt,*); else strcpy(tt,/); scaner(); strcpy(ep2,factor(); strcpy(tp,newtemp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); return (eplace);char *factor() char *fplace; fplace=(char *)malloc(12); strcpy(fplace,); if(syn=10) strcpy(fplace,token); scaner(); else if(syn=11) itoa(sum,fplace,10); scaner(); else if(syn=27) scaner(); fplace=expression(); if(syn=28) scaner(); else printf(error on ) !n); kk=1; getch(); exit(0); else printf(error on ( !n); kk=1; getch(); exit(0); return

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論