문법 분석기의 설계와 실현

3173 단어 flex&bison
1. 실험 목적
귀속 하강 분석 프로그램을 작성하여 어법 분석 프로그램이 제공하는 단어 서열을 실현하다
의 문법 검사와 구조 분석.
2. 실험 내용
C 언어를 이용하여 귀속 하강 분석 프로그램을 작성하고 간단한 언어에 대해 문법 분석을 한다.
2.1 분석할 간단한 언어의 문법
확장된 BNF는 다음과 같습니다.
⑴::=beginend
⑵::={;}
⑶::=
⑷::=ID:=
⑸::={+ | -}
⑹::={* |/
⑺::=ID | NUM | ()
2.2 실험 요구 사항 설명
단어 열을 입력하여 "#"로 끝내고 문법이 정확한 문장이면 성공 정보를 출력합니다.
"success"를 인쇄하지 않으면 "error"를 출력합니다.
예:
begin a:=9 입력;x:=2*3; b:=a+x end #
출력 성공
입력 x:=a+b*c end#
출력 오류
#include
#include
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
"); 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
"); else printf("success
"); } return 0; }

좋은 웹페이지 즐겨찾기