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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論