#include "stdio.h" /*定义I/O库所用的某些宏和变量*/ #include "string.h" /*定义字符串库函数*/ #include "conio.h" /*提供有关屏幕窗口操作函数*/ #include "ctype.h" /*分类函数*/ char prog[80]={'/0'}, token[8]; /*存放构成单词符号的字符串*/ char ch; int syn, /*存放单词字符的种别码*/ n, sum, /*存放整数型单词*/ m,p; /*p是缓冲区prog的指针,m是token的指针*/ char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { m=0; sum=0; for(n=0;n<8;n++) token[n]='/0'; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if(isalpha(ch)) /*ch为字母字符*/ { while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/ { token[m++]=ch; ch=prog[p++]; } token[m++]='/0'; ch=prog[p--]; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) /*字符串的比较*/ { syn=n+1; break; } } else if(isdigit(ch)) /*ch是数字字符*/ { while(isdigit(ch)) /*ch是数字字符*/ { sum=sum*10+ch-'0'; ch=prog[p++]; } ch=prog[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; ch=prog[p--]; } break; case'>':m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; ch=prog[p--]; } break; case':':m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; ch=prog[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; default:syn=-1; } } main() { printf("/n/nThe significance of the figures:/n" "1.figures 1 to 6 said Keyword/n" "2.figures 10 and 11 said Other indicators/n" "3.figures 13 to 28 said Operators/n"); p=0; printf("/nplease input string: (end of /"#/")/n"); do { ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do { scaner(); switch(syn) { case 11: printf("(%d,%d)/n",syn,sum);break; case -1: printf("/n ERROR;/n");break; default: printf("(%d,%s)/n",syn,token); } }while(syn!=0); printf("/nplease enter key..."); getch(); }