문법 분석기의 설계와 실현
3173 단어 flex&bison
귀속 하강 분석 프로그램을 작성하여 어법 분석 프로그램이 제공하는 단어 서열을 실현하다
의 문법 검사와 구조 분석.
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;
}