X理工大学
《编译原理》
题目语法分析程序
姓名: _____________________________
学号: _____________________________
班级: _____________________________
一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二、实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1待分析的简单语言的语法
用扩充的BNF表示如下:
⑴ <程序>::=begin<语句串>end
⑵ <语句串>::=<语句>{;<语句>}
⑶ <语句>::=<赋值语句>
⑷ <赋值语句>::=ID :=<表达式>
⑸ <表达式>::=<项>{+<项>卜<项>}
⑹ <项>::=<因子>{*<因子> | /<因子>
⑺ <因子>::=ID | NUM | (<表达式>)
2.2实验要求说明
输入单词串,以“ #”结束,如果是文法正确的句子,贝U输出成功信息,打印“ succesS', 否则输出“ error”。
例如:
输入begin a:=9; x:=2*3; b:=a+x end #
输出success
输入x:=a+b*c end #
输出error
2.3语法分析程序的酸法思想
⑴主程序示意图如图2-1所示。
结束
图2-1语法分析主程序示意图
⑵递归下降分析程序示意图如图2-2所示。
⑶语句串分析过程示意图如图2-3所示。
图2-2递归下降分析程序示意图图2-3语句串分析示意图
2-4、2-5、2-6、2-7 所示。
⑷stateme nt语句分析程序流程如
图
图2-4 statement语句分析函数示意图图2-5 expression表达式分析函数示意图
图2-6 term 分析函数示意图
图2-7 factor
分析过程示意图
三、语法分析程序的 C 语言程序源代码 #in elude "stdio.h" #i nclude "stri ng.h"
char prog[100],toke n[ 8],ch;
char *rwtab [ 6]={"begi n","if',"the n","while","do","e nd"}; int syn, p,m, n,sum; int kk; factor 。; expressi on(); yucu(); term(); stateme nt(); lrparser(); sca ner(); main () { p=kk=0;
printf("\nGrade:05 Class:03 Name:Qiyubing Number:200507096 \n ”); prin tf("\n----Please in put the stri ng end with '#': ---- \n"); do
{ scanf("%c",&ch); prog[p++]=ch;
调用factor 函数
否
是否* , /?
是否标识符?
是
否
是
是否整常数?
调用 scaner
J
调用factor 函数
是
出错处理
否
否
是否(?
是
调用seaner
出错处理
调用expression 函数 否
是否)?
是
调用seaner
调用seaner
}while(ch!='#');
p=0; scaner(); lrparser(); getch();
} lrparser()
{
if(syn==1)
{
scaner(); /* 读下一个单词符号*/ yucu(); /* 调用yucu() 函数;*/ if (syn==6)
{ scaner();
if ((syn==0)&&(kk==0)) printf("SUCCESS!\n");
}
else { if(kk!=1) printf("Sorry,the string haven't got an 'end'!\n");
kk=1;
}
}
else { printf("Sorry,haven't got a 'begin'!\n"); kk=1;
}
return;
}
yucu()
{
statement(); /* 调用函数statement();*/
while(syn==26)
{
scaner(); /* 读下一个单词符号*/
if(syn!=6)
statement(); /* 调用函数statement();*/
}
return;
} statement()
{ if(syn==10)
{ scaner(); /* 读下一个单词符号*/
if(syn==18)
{ scaner(); /* 读下一个单词符号*/ expression(); /* 调用函数statement();*/
}
else { printf("Sorry,the sing ':=' is wrong!\n");
kk=1;
}
}
else { printf("Sorry,wrong sentence!\n");
kk=1;
}
return;
}
expression()
{ term();
while((syn==13)||(syn==14))
{ scaner(); /* 读下一个单词符号*/ term(); /* 调用函数term();*/
}
return;
}
term()
{ factor();
while((syn==15)||(syn==16))
{ scaner(); /* 读下一个单词符号*/ factor(); /* 调用函数factor(); */
}
return;
}
factor()
{ if((syn==10)||(syn==11)) scaner();
else if(syn==27)
{ scaner(); /* 读下一个单词符号*/ expression(); /* 调用函数statement();*/ if(syn==28)
scaner(); /* 读下一个单词符号*/
else { printf("Sorry,the error on '('\n");
kk=1;
}
}
else { printf("Sorry,the expression error!\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;
}
}
else if((ch>='0')&&(ch<='9'))
{ while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case '<':m=0;
ch=prog[p++];
if(ch=='>')
{ syn=21;
}
else if(ch=='=')
{ syn=22;
}
else
{ syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];