一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列
的语法检查和结构分析。
二、实验内容
利用 C 语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1 待分析的简单语言的语法
用扩充的 BNF 表示如下:
⑴<程序>::=begin<语句串>end
⑵<语句串>::=<语句>{;<语句>}
⑶<语句>::=<赋值语句>
⑷<赋值语句>::=ID:=<表达式>
⑸<表达式>::=<项>{+<项> | -<项>}
⑹<项>::=<因子>{*<因子> | /<因子>
⑺<因子>::=ID | NUM | (<表达式>)
2.2 实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,
打印“success,”否则输出“error。”
例如:
输入 begin a:=9; x:=2*3; b:=a+x end #
输出 success
输入 x:=a+b*c end #
输出 error
#include<stdio.h>
#include<string.h>
int id(char a[],int i)
{
if(a[i]<='z'&&a[i]>='a')
{
for(i++;(a[i]<='z'&&a[i]>='a')||(a[i]>='0'&&a[i]<='9');i++);
if(a[i]==':'&&a[i+1]=='=')
return i+2;
else
return -1;
}
else
return -1;
}
int yinzi(char e[])
{
int i=0;
if(e[i]>='a'&&e[i]<='z')
{
for(i++;e[i]<='z'&&e[i]>='a'||e[i]>='0'&&e[i]<='9';i++);
if(i!=strlen(e))
return -1;
else
return 1;
}
else if(e[i]>='0'&&e[i]<='9')
{
for(i++;e[i]<='9'&&e[i]>='0';i++);
if(i!=strlen(e))
return -1;
else
return 1;
}
else
return -1;
}
int biaodashi(char d[],int i);
int kuohao(char d[],int i)
{
int kz=1,ky=0,j=0;
char e[200]={};
for(i+=1;d[i]!='\0'&&kz>ky;i++)
{
if(d[i]=='(')
{
kz++;
e[j++]=d[i];
}
else if(d[i]==')')
{
ky++;
if(kz>ky)
e[j++]=d[i];
}
else
e[j++]=d[i];
}
if(kz!=ky)
return -1;
else
{
j=0;
if(biaodashi(e,j)>0)
return i;
else
return -1;
}
}
int jiequ(char d[],int i)
{
int j=0;
char e[200]={};
while(!(d[i]=='+'||d[i]=='-'||d[i]=='*')&&i!=strlen(d))
e[j++]=d[i++];
int k=yinzi(e);
if(k<0)
return -1;
else
return i;
}
int biaodashi(char d[],int i)
{
int k=0;
if(d[i]=='(')
k=kuohao(d,i);
else
k=jiequ(d,i);
if(k<0)
return -1;
else if(k==strlen(d))
return 1;
else
i=k;
if(d[i]=='+'||d[i]=='-'||d[i]=='*'||d[i]=='/')
{
i++;
if(biaodashi(d,i)<0)
return -1;
else
return 1;
}
else if(d[i]==strlen(d))
return 1;
else
return -1;
}
int main()
{
char a[200]={},b[10]={},c[10]={};
scanf("%s ",b);
gets(a);
int n=0,i=0,j=0,k=0;
n=strlen(a);
for(i=n-6;i<=n-1;i++)
c[j++]=a[i];
if((strcmp("begin",b)!=0)||(strcmp(" end #",c)!=0))
printf("error\n");
else
{
for(i=0;i<=n-7;)
{
k=id(a,i);
if(k<0)
break;
else
{
i=k;
k=0;
}
char d[200]={};
j=0;
while(a[i]!=';'&&i<=n-7)
d[j++]=a[i++];
i+=2;
k=biaodashi(d,0);
if(k<0)
break;
else
k=0;
}
if(k<0)
printf("error\n");
else
printf("success\n");
}
return 0;
}