版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 語法分析一、 實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)遞歸下降分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列的語法檢查和結(jié)構(gòu)分析。二、 實(shí)驗(yàn)要求利用C語言編制遞歸下降分析程序,并對(duì)簡單語言進(jìn)行語法分析。2.1 待分析的簡單語言的語法用擴(kuò)充的BNF表示如下:<程序>:=begin<語句串>end<語句串>:=<語句>;<語句><語句>:=<賦值語句><賦值語句>:=ID:=<表達(dá)式><表達(dá)式>:=<項(xiàng)>+<項(xiàng)> | -<項(xiàng)><項(xiàng)>:=<因子>
2、*<因子> | /<因子><因子>:=ID | NUM | (<表達(dá)式>)2.2 實(shí)驗(yàn)要求說明輸入單詞串,以“#”結(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讀下一個(gè)單詞符號(hào)調(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出錯(cuò)處理syn=0&&kk=0?否 圖2-3 語句串分析示意圖 是 打印分析成功出錯(cuò)處理 圖2-2 遞歸下降分析程序示意圖 (4)statement語句分析程序流程如圖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語句分析函數(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分析過程示意圖三、 語法分析程序的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(); /*讀下一個(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é):通過本次試驗(yàn),了解了語法分析的運(yùn)行過程,主程序大致流程為:“置初值”à調(diào)用scaner函數(shù)讀下一個(gè)單詞符號(hào)à調(diào)用IrParseà結(jié)束。遞歸下降分析的大致流程為:“先判斷是否為begin”à不是則“出錯(cuò)處理”,若是則“調(diào)用scaner函數(shù)”à調(diào)用語句串分析函數(shù)à“判斷是否為end”à不是則“出錯(cuò)處理”,若是則調(diào)用scaner函數(shù)à“判斷syn=0&&kk=0是否成立”成立則說明分析成功打印出來。不成
24、立則“出錯(cuò)處理”。語義分析程序#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等.壓縮文件請(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 測(cè)字教學(xué)課程設(shè)計(jì)
- 監(jiān)理課程設(shè)計(jì)文檔
- 科普研學(xué)課程設(shè)計(jì)
- 物理課課程設(shè)計(jì)范文
- 機(jī)械專業(yè)簡歷課程設(shè)計(jì)
- 污水廠課程設(shè)計(jì)教程
- 清洗茶具課程設(shè)計(jì)思路
- 礦山測(cè)量課程設(shè)計(jì)要求
- 礦業(yè)大學(xué)課程設(shè)計(jì)答案
- 底板的課程設(shè)計(jì)
- Unit 2 How often do you exercise Section A 1a-2d 教學(xué)實(shí)錄 2024-2025學(xué)年人教版八年級(jí)英語上冊(cè)
- 2024年公路工程資料歸檔與承包合同3篇
- 法律邏輯學(xué)知到智慧樹章節(jié)測(cè)試課后答案2024年秋西南政法大學(xué)
- 山東省臨沂市2023-2024學(xué)年高二上學(xué)期期末學(xué)業(yè)水平檢測(cè)歷史試題 含答案
- 《中華人民共和國學(xué)前教育法》專題培訓(xùn)
- 廣告牌匾安裝施工方案
- 馬克思主義基本原理期末試題及答案
- GB/T 13738.2-2017紅茶第2部分:工夫紅茶
- 老視的機(jī)制及治療
- IATF16949事態(tài)升級(jí)處理程序
- xx縣人民醫(yī)院護(hù)理人員面試評(píng)分表
評(píng)論
0/150
提交評(píng)論