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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

語法分析試驗(yàn)?zāi)康木幹埔环N遞歸下降分析程序,實(shí)現(xiàn)對詞法分析程序所提供的單詞序列的語法檢查和構(gòu)造分析。試驗(yàn)規(guī)定運(yùn)用C語言編制遞歸下降分析程序,并對簡樸語言進(jìn)行語法分析。2.1待分析的簡樸語言的語法用擴(kuò)充的BNF表達(dá)如下:⑴<程序>::=begin<語句串>end⑵<語句串>::=<語句>{;<語句>}⑶<語句>::=<賦值語句>⑷<賦值語句>::=ID:=<體現(xiàn)式>⑸<體現(xiàn)式>::=<項(xiàng)>{+<項(xiàng)>|-<項(xiàng)>}⑹<項(xiàng)>::=<因子>{*<因子>|/<因子>⑺<因子>::=ID|NUM|(<體現(xiàn)式>)2.2試驗(yàn)規(guī)定闡明輸入單詞串,以“#”結(jié)束,假如是文法對的的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如:輸入begina:=9;x:=2*3;b:=a+xend#輸出success!輸入x:=a+b*cend#輸出error2.3語法分析程序的酸法思想(1)主程序示意圖如圖2-1所示。置初值置初值調(diào)用scaner讀下一種單詞符號調(diào)用scaner讀下一種單詞符號調(diào)用lrparser調(diào)用lrparser結(jié)束結(jié)束圖2-1語法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2-2所示。(3)語句串分析過程示意圖如圖2-3所示。與否begin?與否begin?調(diào)用statement函數(shù) 否調(diào)用statement函數(shù) 是與否;?調(diào)用scaner與否;?調(diào)用scaner否調(diào)用語句串分析程序調(diào)用語句串分析程序 是調(diào)用scaner調(diào)用scaner與否end?否與否end? 調(diào)用statement函數(shù)調(diào)用statement函數(shù) 是調(diào)用scaner調(diào)用scaner出錯(cuò)處理出錯(cuò)處理syn=0&&kk=0? 否syn=0&&kk=0? 圖2-3語句串分析示意圖是打印分析成功出錯(cuò)處理 打印分析成功出錯(cuò)處理 圖2-2遞歸下降分析程序示意圖(4)statement語句分析程序流程如圖2-4、2-5、2-6、2-7所示。調(diào)用term函數(shù)與否標(biāo)識符?調(diào)用term函數(shù)與否標(biāo)識符? 否調(diào)用expression函數(shù)調(diào)用scaner與否:=?調(diào)用scaner調(diào)用expression函數(shù)調(diào)用scaner與否:=?調(diào)用scaner與否+,-? 否與否+,-? 否 是調(diào)用scaner調(diào)用scaner調(diào)用term函數(shù)調(diào)用term函數(shù)出錯(cuò)處理出錯(cuò)處理出錯(cuò)處理出錯(cuò)處理圖2-4statement語句分析函數(shù)示意圖圖2-5expression體現(xiàn)式分析函數(shù)示意圖調(diào)用scaner調(diào)用factor函數(shù)出錯(cuò)處理與否*,/?調(diào)用factor函數(shù)調(diào)用scaner調(diào)用factor函數(shù)出錯(cuò)處理與否*,/?調(diào)用factor函數(shù)與否標(biāo)識符? 是與否標(biāo)識符? 否 否與否整常數(shù)? 是與否整常數(shù)? 是 否與否(? 否與否(? 是調(diào)用scaner調(diào)用scaner與否)?調(diào)用expression函數(shù)圖2-6term分析函數(shù)示意圖與否)?調(diào)用expression函數(shù) 否出錯(cuò)處理調(diào)用scaner調(diào)用scaner 是出錯(cuò)處理調(diào)用scaner調(diào)用scaner 圖2-7factor分析過程示意圖語法分析程序的C語言程序源代碼:#include"stdio.h"

#include"string.h"

charprog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum;

intkk;

factor();

expression();

yucu();

term();

statement();

lrparser();

scaner();

main()

{

p=kk=0;

printf("\npleaseinputastring(endwith'#'):\n");

do

{scanf("%c",&ch);

prog[p++]=ch;

}while(ch!='#');

p=0;

scaner();

lrparser();

getch();

}

lrparser()

{

if(syn==1)

{scaner();/*讀下一種單詞符號*/

yucu();/*調(diào)用yucu()函數(shù);*/

if(syn==6)

{scaner();

if((syn==0)&&(kk==0))printf("success!\n");

}

else{if(kk!=1)printf("thestringhaven'tgota'end'!\n");

kk=1;

}

}

else{printf("haven'tgota'begin'!\n");

kk=1;

}

return;

}

yucu()

{statement();/*調(diào)用函數(shù)statement();*/

while(syn==26)

{scaner();/*讀下一種單詞符號*/

if(syn!=6)statement();/*調(diào)用函數(shù)statement();*/

}

return;

}

statement()

{if(syn==10)

{scaner();/*讀下一種單詞符號*/

if(syn==18)

{scaner();/*讀下一種單詞符號*/

expression();/*調(diào)用函數(shù)statement();*/

}

else{printf("thesing':='iswrong!\n");

kk=1;

}

}

else{printf("wrongsentence!\n");

kk=1;

}

return;

}

expression()

{term();

while((syn==13)||(syn==14))

{scaner();/*讀下一種單詞符號*/

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();

elseif(syn==27)

{scaner();/*讀下一種單詞符號*/

expression();/*調(diào)用函數(shù)statement();*/

if(syn==28)scaner();/*讀下一種單詞符號*/

else{printf("theerroron'('\n");

kk=1;

}

}

else{printf("theexpressionerror!\n");

kk=1;

}

return;

}

scaner()

{

sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

m=0;

ch=prog[p++];

while(ch=='')ch=prog[p++];

if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

token[m++]='\0';

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{syn=n+1;

break;

}

}

elseif((ch>='0')&&(ch<='9'))

{while((ch>='0')&&(ch<='9'))

{sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=11;

}

elseswitch(ch)

{case'<':m=0;

ch=prog[p++];

if(ch=='>')

{

syn=21;

}

elseif(ch=='=')

{

syn=22;

}

else

{

syn=20;

p--;

}

break;

case'>':m=0;

ch=prog[p++];

if(ch=='=')

{syn=24;

}

else

{syn=23;

p--;

}

break;

case':':m=0;

ch=prog[p++];

if(ch=='=')

{syn=18;

}

else

{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=0;break;

default:syn=-1;break;

}

}成果分析:輸入begina:=9;x:=2*3;b:=a+xend#后輸出success!如圖4-1所示:圖4-1輸入x:=a+b*cend#后輸出error如圖4-2所示:圖4-2總結(jié):通過本次試驗(yàn),理解了語法分析的運(yùn)行過程,主程序大體流程為:“置初值”調(diào)用scaner函數(shù)讀下一種單詞符號調(diào)用IrParse結(jié)束。遞歸下降分析的大體流程為:“先判斷與否為begin”不是則“出錯(cuò)處理”,若是則“調(diào)用scaner函數(shù)”調(diào)用語句串分析函數(shù)“判斷與否為end”不是則“出錯(cuò)處理”,若是則調(diào)用scaner函數(shù)“判斷syn=0&&kk=0與否成立”成立則闡明分析成功打印出來。不成立則“出錯(cuò)處理”。語義分析程序#include"stdio.h"

#include"string.h"

charprog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum,q;

intkk;

struct{charresult1[8];

charag11[8];

charop1[8];

charag21[8];

}quad[20];

char*factor();

char*expression();

intyucu();

char*term();

intstatement();

intlrparser();

char*newtemp();

scaner();

emit(char*result,char*ag1,char*op,char*ag2);

main()

{intj;

q=p=kk=0;

printf("\npleaseinputastring(endwith'#'):");

do

{scanf("%c",&ch);

prog[p++]=ch;

}while(ch!='#');

p=0;

scaner();

lrparser();

if(q>19)printf("tolongsentense!\n");

elsefor(j=0;j<q;j++)printf("

%s=%s%s%s\n\n",quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);

getch();

}

intlrparser()

{intschain=0;

kk=0;

if(syn==1)

{scaner();

schain=yucu();

if(syn==6)

{scaner();

if((syn==0)&&(kk==0))

printf("Success!\n");

}

else{if(kk!=1)printf("shortof'end'!\n");

kk=1;

getch();

exit(0);

}

}

else{printf("shortof'begin'!\n");

kk=1;

getch();

exit(0);

}

return(schain);

}

intyucu()

{intschain=0;

schain=statement();

while(syn==26)

{scaner();

schain=statement();

}

return(schain);

}

intstatement()

{chartt[8],eplace[8];

intschain=0;

if(syn==10)

{strcpy(tt,token);

scaner();

if(syn==18)

{scaner();

strcpy(eplace,expression());

emit(tt,eplace,"","");

schain=0;

}

else{printf("shortofsign':='!\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,term());

while((syn==13)||(syn==14))

{if(syn==13)strcpy(tt,"+");

elsestrcpy(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=(char*)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))

{if(syn==15)strcpy(tt,"*");

elsestrcpy(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();

}

elseif(syn==11)

{itoa(sum,fplace,10);

scaner();

}

elseif(syn==27)

{scaner();

fplace=expression();

if(syn==28)scaner();

else{printf("erroron')'!\n");

kk=1;

getch();

exit(0);

}

}

else{printf("erroron'('!\n");

kk=1;

getch();

exit(0);

}

return(fplace);

}

char*newtemp()

{char*p;

charm[8];

p=(char*)malloc(8);

kk++;

itoa(kk,m,10);

strcpy(p+1,m);

p[0]='t';

return(p);

}

scaner()

{

sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

m=0;

ch=prog[p++];

while(ch=='')ch=prog[p++];

if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

token[m++]='\0';

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{syn=n+1;

break;

}

}

elseif((ch>='0')&&(ch<='9'))

{while((ch>='0')&&(ch<='9'))

{sum=sum*10+ch-'0

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論