完整版編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼C語(yǔ)言版1_第1頁(yè)
完整版編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼C語(yǔ)言版1_第2頁(yè)
完整版編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼C語(yǔ)言版1_第3頁(yè)
完整版編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼C語(yǔ)言版1_第4頁(yè)
完整版編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼C語(yǔ)言版1_第5頁(yè)
已閱讀5頁(yè),還剩17頁(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)鍵字:beg in if the n while do end所有的關(guān)鍵字都是小寫(xiě)。(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.1各種單詞符號(hào)對(duì)應(yīng)的

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

3、,:=)(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 = begi n”,if ”,fhen ”,While ”,d o”,

4、en d,;圖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所示。1 F變量初始化返回圖3-2四、詞法分析程序的C語(yǔ)言程序源代碼:#i nclude #in elude char prog80,toke n 8,ch;int syn, p,m, n,sum;char *rwtab 6=begi n,if,the n,while,do,e nd; sca ner();main ()P=0;prin tf(

5、n please in put a stri ng(e nd with #):/n);doscan f(%c,&ch);progp+=ch;while(ch!=#);p=0;dosca ner();switch(s yn)case 11:printf( %-10d%5d )n,sum,syn); break;case -1:pri ntf(you have in put a wrong stri ngn); getch();exit(0);default: printf( %-10s%5d )n,token,syn); break; while(syn!=0); getch();scaner(

6、) 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; 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;els

7、e 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; tokenm+=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;

8、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=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=

9、0; tokenm+=ch; break;case :syn=17; tokenm+=ch;break;default: syn=-1;break;toke n m+=0:五、結(jié)果分析:輸入 beg in x:=9: if x9 then x:=2*x+1/3; end #后經(jīng)詞法分析輸出如下序列:(begin 1)(x10)(: 17)(=18)(911)(; 26)(if2) 如圖 5-1 所示:駅三下譯原理CIFAFE-1 .exe begin1 X10 :17 =1 211 ;26 if2(xIB23 011 then3 X10 :17 -18 211 15 X10 +13 111 /

10、16 311 ;6yI end tt圖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表示如下: 程序:=begin語(yǔ)句串end 語(yǔ)句串 :=語(yǔ)句; 語(yǔ)句 語(yǔ)句 := 賦值語(yǔ)句 賦值語(yǔ)句 :=ID :=表達(dá)式 表達(dá)式 :=

11、項(xiàng)+項(xiàng) 卜 項(xiàng) 項(xiàng) := 因子*因子 | /因子 因子:=ID | NUM |( 表達(dá)式)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所示。圖2-1語(yǔ)法分析主程序示意圖(2) 遞歸下降分析程序示意圖如圖2-2所示。(3) 語(yǔ)句串分析過(guò)程示意圖如圖2-3所示。圖2-2遞歸下降分析程序示意圖(4) sta

12、tement語(yǔ)句分析程序流程如圖2-4、2-5、2-6、2-7所示。圖2-4 statement語(yǔ)句分析函數(shù)示意圖 圖2-5 expression表達(dá)式分析函數(shù)示意圖#in elude stdio.h#i nclude stri ng.hchar prog100,toke n 8,ch;char *rwtab 6=begi n,if,the n,while,do,e nd; int syn, p,m, n,sum;int kk;factor();expressi on();yucu();term();stateme nt();lrparser();sca ner();main ()p=kk=0

13、;prin tf(nplease in put a stri ng (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) scaner();if (syn=0)&(kk=0)printf(success!n);else if(kk!=1) printf(the string havent got a end!n);

14、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(syn=10)scaner(); /* 讀下一個(gè)單詞符號(hào) */if(syn=18) scaner(); expression();/* 讀下一個(gè)單詞符號(hào) */* 調(diào)用函數(shù) statement();*/else

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

16、n=11) scaner();else if(syn=27) scaner();expression(); if(syn=28) scaner();/* 讀下一個(gè)單詞符號(hào) */* 調(diào)用函數(shù) statement();*/* 讀下一個(gè)單詞符號(hào) */else printf(the error on (n); kk=1;else printf(the expression error!n); 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)

17、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=) 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;e

18、lse 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 =: syn=25;break;case ;: syn=26;break;case #: syn=O;break;default: syn=-1;break;四、結(jié)果分析:輸入 begin a:=9; x:=2*3; b:=a+x end # 后輸出 success!如圖 4-1 所示:盲比伙

19、三下譯原理yufafe1 .exeplease input a string (end. with * it* 5 begin a;=9; x:=2*3; h:=a+x end H success*圖4-1輸入 x:=a+b*c end # 后輸出 error如圖4-2所示:寅D:V三下胡僅詳原理ufsfe-1.exeplease iniput a string (end uith f ttO : ft:a+b*c end Ithauen,t got a begin *圖4-2五、總結(jié):通過(guò)本次試驗(yàn),了解了語(yǔ)法分析的運(yùn)行過(guò)程,主程序大致流程為:“置初值”調(diào)用scaner函數(shù)讀下一個(gè)單詞符號(hào)調(diào)用

20、IrParse結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin ” 不是則“出錯(cuò)處理”,若是則“調(diào)用scaner函數(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;

21、char ag118;char op18;char ag218; quad20;char *factor();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;

22、while(ch!=#);p=0;scaner();lrparser();if(q19)printf( to long sentense!n);else for (j=0;jq;j+)printf(%s = %s %s %snn,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(k

23、k!=1)printf(short of end !n);kk=1;getch();exit(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

24、();if(syn=18) scaner();strcpy(eplace,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,t

25、erm(); while(syn=13)|(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=(cha

26、r *)malloc(12); 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);

溫馨提示

  • 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)論