版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)建筑瓦工施工承包合同
- 旅游業(yè)文化墻施工合同
- 橋梁工程分包施工合同
- 海參養(yǎng)殖員工職業(yè)倦怠預(yù)防合同
- 商業(yè)秘密保護(hù)律師聘用協(xié)議
- 酒店?duì)I銷策劃方案范文七篇
- 學(xué)期英語工作計(jì)劃三篇
- 學(xué)生心理健康教育與咨詢制度
- -婦產(chǎn)科醫(yī)生年度工作總結(jié)
- 員工辭職申請書模板匯編5篇
- 感染性休克指南解讀
- 老年大學(xué)教學(xué)工作計(jì)劃
- 2025屆河北省石家莊市普通高中學(xué)校畢業(yè)年級教學(xué)質(zhì)量摸底檢測英語試卷
- 國家開放大學(xué)22379丨網(wǎng)絡(luò)技術(shù)基礎(chǔ)(統(tǒng)設(shè)課)期末終考題庫
- 統(tǒng)編版(2024新版)七年級上冊道德與法治第四單元綜合測試卷(含答案)
- 十四五養(yǎng)老規(guī)劃政策解讀
- 曼娜回憶錄完整版三篇
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- NCCN 非小細(xì)胞肺癌指南2024
- 土木工程可持續(xù)發(fā)展調(diào)查報(bào)告
- 古代文學(xué)論文論陳寅恪文史互證對《鶯鶯傳》文本解讀的價(jià)值
評論
0/150
提交評論