#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char prog[800],token[20];
int syn,p,m,n,sum=0;
char *word[6]={"begin","if","then","while","do","end"}; //关键字
char ch;
main(){
p=0;//指针从0开始
printf("请输入源程序段:");
do{ //读入字符,放入prog数组,直到'#'停止
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{ //临时数组初始化
for(n=0;n<20;n++){
token[n]=NULL;
}
ch=prog[p++]; //跳过空字符
while(ch==' '){
ch=prog[p];
p++;
}
//判断标识符和关键字
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
//判断保留字
for(n=0;n<6;n++){
if(strcmp(token,word[n])==0){
syn=n+1;
break;
}
}
}
//判断数字
else if((ch>='0'&&ch<='9')){
sum=0;
while((ch>='0'&&ch<='9')){
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else{ //判断其他符号
switch(ch){
case '<':m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=21;
token[m++]=ch;
}
else if(ch=='>'){
syn=22;
token[m++]=ch;
}
else{
syn=20;
p--;
}
break;
case '>':m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;
}
else{
syn=23;
p--;
}
break;
case ':':m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;
}
else{
syn=17;
p--;
}
break;
case '+':syn=13;token[0]=ch;break;
case '-':syn=14;token[0]=ch;break;
case '*':syn=15;token[0]=ch;break;
case '/':syn=16;token[0]=ch;break;
case '=':syn=25;token[0]=ch;break;
case ';':syn=26;token[0]=ch;break;
case '(':syn=27;token[0]=ch;break;
case ')':syn=28;token[0]=ch;break;
case '#':syn=0;token[0]=ch;break;
}
}
switch(syn){
default:printf("(%d,%s)\n",syn,token);break;
}
}while(syn!=0);
}