




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 語法分析一、 實驗?zāi)康木幹埔粋€遞歸下降分析程序,實現(xiàn)對詞法分析程序所提供的單詞序列的語法檢查和結(jié)構(gòu)分析。二、 實驗要求利用C語言編制遞歸下降分析程序,并對簡單語言進(jìn)行語法分析。2.1 待分析的簡單語言的語法用擴(kuò)充的BNF表示如下:<程序>:=begin<語句串>end<語句串>:=<語句>;<語句><語句>:=<賦值語句><賦值語句>:=ID:=<表達(dá)式><表達(dá)式>:=<項>+<項> | -<項><項>:=<因子>
2、*<因子> | /<因子><因子>:=ID | NUM | (<表達(dá)式>)2.2 實驗要求說明輸入單詞串,以“#”結(jié)束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如: 輸入 begin a:=9; x:=2*3; b:=a+x end # 輸出 success! 輸入 x:=a+b*c end # 輸出 error2.3 語法分析程序的酸法思想(1)主程序示意圖如圖2-1所示。置初值調(diào)用scaner讀下一個單詞符號調(diào)用lrparser結(jié)束圖2-1 語法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2
3、-2所示。(3)語句串分析過程示意圖如圖2-3所示。 是否begin?調(diào)用statement函數(shù)否是是否 ;?調(diào)用scaner否調(diào)用語句串分析程序是 調(diào)用scaner是否end? 否調(diào)用statement函數(shù)是調(diào)用scaner出錯處理syn=0&&kk=0?否 圖2-3 語句串分析示意圖 是 打印分析成功出錯處理 圖2-2 遞歸下降分析程序示意圖 (4)statement語句分析程序流程如圖2-4、2-5、2-6、2-7所示。調(diào)用term函數(shù)是否標(biāo)識符?否調(diào)用expression函數(shù)調(diào)用scaner是否:=?調(diào)用scaner是否+ , -?否否是調(diào)用scaner調(diào)用term函數(shù)
4、出錯處理出錯處理圖2-4 statement語句分析函數(shù)示意圖 圖2-5 expression表達(dá)式分析函數(shù)示意圖調(diào)用scaner調(diào)用factor函數(shù)出錯處理是否* , /?調(diào)用factor函數(shù)是否標(biāo)識符?是否否是否整常數(shù)?是是否是否(?否是調(diào)用scaner是否)?調(diào)用expression函數(shù)圖 2-6 term分析函數(shù)示意圖否出錯處理調(diào)用scaner調(diào)用scaner是圖2-7 factor分析過程示意圖三、 語法分析程序的C語言程序源代碼:#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(); /*讀下一個單詞符號*/ 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(); /*讀下一個單詞符號*/ if(syn!=6) statement(); /*調(diào)用函數(shù)statement();*/
9、60; return;statement() if(syn=10) scaner(); /*讀下一個單詞符號*/ if(syn=18) scaner(); /*讀下一個單詞符號*/ 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(); /*讀下一個單詞符號*/
11、 term(); /*調(diào)用函數(shù)term();*/ return;term() factor(); while(syn=15)|(syn=16) scaner(); /*讀下一個單詞符號*/ factor(); /*調(diào)用函數(shù)factor(); */ return;factor() if(syn=10)|(syn=11) scaner();
12、60; else if(syn=27) scaner(); /*讀下一個單詞符號*/ expression(); /*調(diào)用函數(shù)statement();*/ if(syn=28) scaner(); /*讀下一個單詞符號*/ 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é):通過本次試驗,了解了語法分析的運行過程,主程序大致流程為:“置初值”à調(diào)用scaner函數(shù)讀下一個單詞符號à調(diào)用IrParseà結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”à不是則“出錯處理”,若是則“調(diào)用scaner函數(shù)”à調(diào)用語句串分析函數(shù)à“判斷是否為end”à不是則“出錯處理”,若是則調(diào)用scaner函數(shù)à“判斷syn=0&&kk=0是否成立”成立則說明分析成功打印出來。不成
24、立則“出錯處理”。語義分析程序#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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋認(rèn)購合同書范本
- 贈與個人財產(chǎn)合同書
- 電腦期貨委托買賣合同
- 2025標(biāo)準(zhǔn)借款合同協(xié)議樣本
- 法國餐館轉(zhuǎn)讓協(xié)議書
- 動葉可調(diào)軸流電站用風(fēng)機項目風(fēng)險分析和評估報告
- 多功能氣象衛(wèi)星接收系統(tǒng)項目風(fēng)險分析和評估報告
- 河北旅游職業(yè)學(xué)院《組織文化研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 楚雄師范學(xué)院《土木工程施工組織》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊市元氏縣2025屆六年級下學(xué)期小升初數(shù)學(xué)試卷含解析
- 【初中 語文】第9課《木蘭詩》課件2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 吉林省吉林市2024-2025學(xué)年高三下學(xué)期3月三模試題 數(shù)學(xué) 含答案
- 2024年上海靜安區(qū)教育系統(tǒng)招聘考試真題
- 2025年4月自考15040習(xí)概押題及答案
- 湖北省十一校2025屆高三第二次聯(lián)考數(shù)學(xué)試卷(含答案)
- 廣東省2025屆高三下學(xué)期3月綜合能力測試(CAT) 英語試題(含答案)
- 高中主題班會 我命由我少年當(dāng)燃課件-高一下學(xué)期開學(xué)第一次班會
- 林海雪原考試題和答案
- 綜合與實踐 低碳生活 教學(xué)設(shè)計 2024-2025學(xué)年人教版七年級數(shù)學(xué)下冊
- 大一勞動教育課
- 湖南省2024年對口升學(xué)考試計算機綜合真題試卷
評論
0/150
提交評論