语法分析器设计与实现

时间:2021-01-07 16:49:15

一、实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列

的语法检查和结构分析。

二、实验内容

利用语言编制递归下降分析程序,并对简单语言进行语法分析。

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;
}