#include
#include
#include
#define Max 1000
int j=1;
long g=0;
char nchar[Max]={""};
int k=0;
char ch=NULL;
char m[30]={""};
int sym=-1;
int error=0;
main()
{
char cha;
printf("请输入一串字符串:");
while((cha=getchar())!=‘$‘)
{
nchar[g]=cha;
g++;
}
scanner();
E();
if(sym==0&&error==0)
{
printf("success\n");
}
else
{
printf("fail\n");
}
}
void E()
{
T();
E1();
}
void E1()
{
if(sym==13)
{
scanner();
T();
E1();
}
else
{
if(sym!=0&&sym!=28)
{
printf("error\n");
error++;
}
}
}
void T()
{
F();
T1();
}
T1()
{
if(sym==15)
{
scanner();
F();
T1();
}
else
{
if(sym!=28&&sym!=0&&sym!=13)
{
printf("error\n");
error++;
}
}
}
void F()
{
if(sym==27)
{
scanner();
E();
if(sym==28)
{
scanner();
}
else
{
printf("error\n");
error++;
}
}
else if(sym==10||sym==11)
{
scanner();
}
else
{
printf("error\n");
error++;
}
}
int scanner()
{
int i;
char a[2]={""};
char word[][15]={"begin","do","end","if","then","while"};
int wsym[6]={1,2,3,4,5,6};
int ssym[9]={25,26,27,28,0,13,14,15,16};
char b[9]={‘=‘,‘;‘,‘(‘,‘)‘,‘#‘,‘+‘,‘-‘,‘*‘,‘/‘};
if(j==1&&k
{
ch=nchar[k];
j++;
k++;
}
while(ch==‘ ‘||ch==10||ch==9||ch==13)
{
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
if(ch>=‘a‘&&ch<=‘z‘)
{
while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘)||ch==‘_‘)
{
a[0]=ch;
strcat(m,a);
printf("%s",m);
if(k==g)
{
break;
}
ch=nchar[k];
k++;
}
for(i=0;i<6;i++)
{
if(strcmp(m,&word[i][0])==0)
break;
}
if(i<6)
{
sym=wsym[i];
printf("保留字%s 种别码%d\n",m,wsym[i]);
}
else
{
sym=10;
printf("标识符%s 种别码10\n",m);
}
if(k==g)
return 0;
strcpy(m,"");
return 1;
}
else if(ch>=‘0‘&&ch<=‘9‘)
{
while(ch>=‘0‘&&ch<=‘9‘)
{
a[0]=ch;
strcat(m,a);
if(k==g)
{
break;
}
ch=nchar[k];
k++;
}
sym=11;
printf("常数%s 种别码11\n",m);
if(k==g)
return 0;
strcpy(m,"");
return 1;
}
else if(ch==‘:‘)
{
a[0]=ch;
strcat(m,a);
if(k==g)
{
sym=17;
printf("运算符%s 种别码17\n",m);
return 0;
}
ch=nchar[k];
k++;
if(ch==‘=‘)
{
a[0]=ch;
strcat(m,a);
sym=18;
printf("运算符%s 种别码18\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
strcpy(m,"");
return 1;
}
else if(ch==‘
{
a[0]=ch;
strcat(m,a);
if(k
{
ch=nchar[k];
k++;
}
if(ch==‘=‘)
{
a[0]=ch;
strcat(m,a);
sym=21;
printf("运算符%s 种别码21\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else if(ch==‘>‘)
{
a[0]=ch;
strcat(m,a);
sym=22;
printf("运算符%s 种别码22\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else
{
printf("运算符%s 种别码22\n",m);
}
if(k==g)
{
return 0;
}
strcpy(m,"");
return 1;
}
else if(ch==‘>‘)
{
a[0]=ch;
strcat(m,a);
if(k
{
ch=nchar[k];
k++;
}
if(ch==‘=‘)
{
a[0]=ch;
strcat(m,a);
sym=24;
printf("运算符%s 种别码24\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else
{
sym=23;
printf("运算符%s 种别码23\n",m);
}
if(k==g)
{
return 0;
}
strcpy(m,"");
return 1;
}
else
{
for(i=0;i<9;i++)
{
if(ch==b[i])
break;
}
if(i<9)
{
sym=ssym[i];
a[0]=ch;
strcat(m,a);
sym=ssym[i];
printf("%s 种别码为:%d\n",m,ssym[i]);
}
else
{
a[0]=ch;
strcat(m,a);
sym=-1;
printf("错误!%s不存在种别码\n",m);
}
if(k
{
ch=nchar[k];
k++;
}
else
{
return 0;
}
strcpy(m,"");
return 1;
}
}