#include<stdio.h>
#define max 200
int i,n,syn;
char pro[max],lin[20];
char *word[6]={"begin","if","then","while","do","end"};
char ch;
scaner()
{
int j=0;
for(n=0;n<20;n++)
lin[n]=NULL;
ch=pro[i++];
while(ch==' ')
ch=pro[i++];
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='Z')||(ch>=48&&ch<=57))
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='Z'))
{
lin[j++]=ch;
ch=pro[i++];
while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='Z')||(ch>=48&&ch<=57))
{
lin[j++]=ch;
ch=pro[i++];
}
lin[j]='\0';
i--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(lin,word[n])==0)
{
syn=n+1;
break;
}
}
else
{
while(ch>=48&&ch<=57)
{
lin[j++]=ch;
ch=pro[i++];
}
i--;
lin[j]='\0';
syn=11;
}
}
else
{
if(ch=='<')
{lin[j++]=ch;
ch=pro[i++];
if (ch=='>')
{
syn=21;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='=')
{
syn=22;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=20;
lin[j]='\0';
i--;
}
}
else if(ch=='>')
{ lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=24;
lin[j++]=ch;
lin[j]='\0';
}
else
{
syn=23;
lin[j]='\0';
i--;
}
}
else if(ch==':')
{
lin[j++]=ch;
ch=pro[i++];
if (ch=='=')
{
syn=18;
lin[j++]=ch;
lin[j]='\0';}
else
{
syn=17;
lin[j]='\0';
i--;
}
}
else if(ch=='+')
{syn=13;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='-')
{
syn=14;
lin[j++]=ch;
lin[j]='\0';}
else if(ch=='*')
{
syn=15;
lin[j++]=ch;
lin[j]='\0';}
else if(ch=='/')
{
syn=16;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='=')
{
syn=25;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==';')
{
syn=26;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch=='(')
{
syn=27;
lin[j++]=ch;
lin[j]='\0';
}
else if(ch==')')
{
syn=28;
lin[j++]=ch;
lin[j]='\0';}
else if(ch=='#')
{
syn=0;
lin[j++]=ch;
lin[j]='\0';
}
else
syn=-1;
}
return syn;
}
void main()
{
int i=0 ;
printf("**************************************************************************\n");
printf("*********************************种别编码*********************************\n");
printf("**************************************************************************\n");
printf("(1,begin) (2,if) (3,then) (4,while) (5,do)\n");
printf("(6,end) (10,基本标示符) (11,数字) (13, ) (14,-)\n");
printf("(15,*) (16,/) (17,:) (18,:=) (20,<)\n");
printf("(21,<>) (22,<=) (23,>) (24,>=) (25,=)\n");
printf("(26,;) (27,() (28,)) (0,#)\n");
read();
printf( "读入的字符串如下: \n\n" );
puts(pro);
printf( "词法分析结果如下:\n" );
printf( "\n" );
do {
scaner();
switch(syn)
{
case 11:
printf ("(%d,%s)\n",syn,lin);
break;
case -1:
printf("错误符号\n");
break;
default:
printf ("(%d,%s)",syn,lin); }
} while (syn!=0);
printf( "\n词法分析结束\n" );
scanf("%c",&i);
}