




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 語(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á)式>:=<項(xiàng)>+<項(xiàng)> | -<項(xiàng)><項(xiàng)>:=<因子>
2、*<因子> | /<因子><因子>:=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所示。置初值調(diào)用scaner讀下一個(gè)單詞符號(hào)調(diào)用lrparser結(jié)束圖2-1 語(yǔ)法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2
3、-2所示。(3)語(yǔ)句串分析過(guò)程示意圖如圖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ù)
4、出錯(cuò)處理出錯(cuò)處理圖2-4 statement語(yǔ)句分析函數(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.h"char prog100,token8,
5、ch;char *rwtab6="begin","if","then","while","do","end"int syn,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")
6、; 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ù);*/ &
7、#160; if (syn=6) scaner(); if (syn=0)&&(kk=0) printf("success!n"); else if(kk!=1) printf("the string haven't got a 'end'!n"); kk=1;
8、160; else printf("haven't 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();*/
9、60; return;statement() if(syn=10) scaner(); /*讀下一個(gè)單詞符號(hào)*/ if(syn=18) scaner(); /*讀下一個(gè)單詞符號(hào)*/ expression(); /*調(diào)用函數(shù)statement();*/ else printf("the sing &
10、#39;:=' is wrong!n"); kk=1; else printf("wrong sentence!n"); kk=1; return;expression() term(); while(syn=13)|(syn=14) scaner(); /*讀下一個(gè)單詞符號(hào)*/
11、 term(); /*調(diào)用函數(shù)term();*/ return;term() factor(); while(syn=15)|(syn=16) scaner(); /*讀下一個(gè)單詞符號(hào)*/ factor(); /*調(diào)用函數(shù)factor(); */ return;factor() if(syn=10)|(syn=11) scaner();
12、60; 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");
13、; kk=1; else printf("the expression error!n"); kk=1; return; scaner() sum=0; for(m=0;m<8;m+)tokenm+=NULL; m=0; ch=pro
14、gp+; while(ch=' ')ch=progp+; if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>
15、='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; p-; syn=10; tokenm+='0' for(n=0;n<6;n+
16、) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<=
17、9;9') sum=sum*10+ch-'0' ch=progp+; p-; syn=11; else switch(ch) case '<':m=0; ch=progp+; if(ch='>') &
18、#160; syn=21; else if(ch='=') syn=22; else syn=20; p-
19、; break; case '>':m=0; ch=progp+; if(ch='=') syn=24; else syn=23;
20、0; p-; break; case ':':m=0; ch=progp+; if(ch='=') syn=18; else
21、0; syn=17; p-; break; case '+': syn=13; break; case '-': syn=14; break; case '*': syn=15;break; case '/': syn=16;break; case '(': syn=27;br
22、eak; case ')': syn=28;break; case '=': 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所
23、示:圖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)用scaner函數(shù)”à調(diào)用語(yǔ)句串分析函數(shù)à“判斷是否為end”à不是則“出錯(cuò)處理”,若是則調(diào)用scaner函數(shù)à“判斷syn=0&&kk=0是否成立”成立則說(shuō)明分析成功打印出來(lái)。不成
24、立則“出錯(cuò)處理”。語(yǔ)義分析程序#include "stdio.h"#include "string.h"char 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;
25、0; 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 &
26、#39;#'): "); do scanf("%c",&ch); progp+=ch; while(ch!='#'); p=0; scaner(); lrparser();if(q>19)printf(" to long sentense!n");else for (j=0;j<q;j+)printf(" %s = %s %s %s
27、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(
28、"Success!n"); else if(kk!=1)printf("short of 'end' !n"); kk=1; getch(); exit(0);
29、; else printf("short of 'begin' !n"); kk=1; getch(); exit(0); return (schain);int yucu() int schain=0; schain=statement(); while(syn=26) scaner();
30、160; schain=statement(); return (schain);int statement() char tt8,eplace8; int schain=0; if (syn=10) strcpy(tt,token); scaner(); if(syn=18) scaner(); strcp
31、y(eplace,expression(); emit(tt,eplace,"",""); schain=0; else printf("short of sign ':=' !n"); kk=1; getch(); exit(0);
32、 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)|(syn=14) if (syn=13)strcpy(tt,"+
33、"); else strcpy(tt,"-"); scaner(); strcpy(ep2,term(); strcpy(tp,newtemp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); retu
34、rn (eplace);char *term() char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12); strcpy(eplace,factor(); while(syn=15)|(syn=16) if (syn=15)strcpy(tt,"*");
35、160; else strcpy(tt,"/"); scaner(); strcpy(ep2,factor(); strcpy(tp,newtemp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); return (eplace);char *factor()
36、 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
37、=27) scaner(); fplace=expression(); if(syn=28) scaner(); else printf("error on ')' !n"); kk=1; getch(); exit(0); &
38、#160; else printf("error on '(' !n"); kk=1; getch(); exit(0); return (fplace);char *newtemp() char *p; char m8; p=(char *)malloc(8); kk+; itoa(kk,m,10); strcpy(p+1,m); p0=&
39、#39;t' return(p); scaner() sum=0; for(m=0;m<8;m+)tokenm+=NULL; m=0; ch=progp+; while(ch=' ')ch=progp+; if(ch<='z')&&(ch>='a')|(ch<='Z&
40、#39;)&&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+;
41、; p-; syn=10; tokenm+='0' for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; &
42、#160; else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; p-; syn=11;
43、 else switch(ch) case '<':m=0; ch=progp+; if(ch='>') syn=21; else if(ch='=') syn=22;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSA 232-2024 特種巡邏機(jī)器人通.用技術(shù)要求
- T-ZJHQ 0003-2024 高等學(xué)校生活垃圾分類工作規(guī)范
- 2025年度電子商務(wù)平臺(tái)數(shù)據(jù)分析與報(bào)告合同模板
- 二零二五年度解除婚約合同范本:婚約解除后的財(cái)產(chǎn)清算、債務(wù)處理及子女監(jiān)護(hù)協(xié)議
- 2025年度鋼板租賃與回收利用合同
- 二零二五年度金融機(jī)構(gòu)資金轉(zhuǎn)入風(fēng)險(xiǎn)管理合同
- 2025年度智慧能源管理系統(tǒng)擔(dān)保人履約保證合同
- 二零二五年度企業(yè)綠色金融項(xiàng)目補(bǔ)貼協(xié)議
- 二零二五年度情人協(xié)議書:浪漫愛(ài)情生活規(guī)劃合同范本
- 石壕吏:歷史背景與社會(huì)問(wèn)題分析教學(xué)教案
- 2025中鐵集裝箱運(yùn)輸有限責(zé)任公司招聘46人(京外地區(qū)崗位)筆試參考題庫(kù)附帶答案詳解
- 中國(guó)農(nóng)業(yè)大學(xué)人文與發(fā)展學(xué)院管理服務(wù)崗位招聘筆試真題2023
- 2023-2024 中國(guó)滑雪產(chǎn)業(yè)白皮書
- 風(fēng)電場(chǎng)觸電急救培訓(xùn)課件
- 二年級(jí)下冊(cè)數(shù)學(xué)課件-1.3 分草莓 北師大版(共14張PPT)
- 2022年中小學(xué)心理健康教育指導(dǎo)綱要
- 中國(guó)紅十字會(huì)救護(hù)員培訓(xùn)理論考試試卷 (1)附答案
- 高架橋梁混凝土工程專項(xiàng)施工方案
- 銀行案件風(fēng)險(xiǎn)排查實(shí)施細(xì)則
- 亞馬遜品牌授權(quán)書(英文模板)
- 10級(jí)空乘《形體訓(xùn)練3》課程標(biāo)準(zhǔn)(共14頁(yè))
評(píng)論
0/150
提交評(píng)論