#include <stdio.h> #include <string.h> char prog[800], token[20]; char ch; int syn,p,m,n,sum; char * rwtab[6]= {"begin","if","then","while","do","end"}; main() { p=0; printf(" 请输入字符串: "); do{ ch=getchar(); prog[p++]=ch; }while (ch!='#'); p=0; do{ scaner(); switch(syn) { case 11: printf(" (%d,%d)",syn,sum); break; case -1: printf(" (%s,出错!)",token);break; default: printf(" (%d,%s)",syn, token); } }while (syn!=0); printf(" 分析成功 "); p=0; scaner(); E(); if (syn==0) printf(" 没有错误. "); else printf(" 出现错误. "); } scaner() { for (n=0;n<20;n++) token[n]=NULL; m=0; sum=0; ch=prog[p++]; while (ch==' ') {ch=prog[p++];} if (ch>='a'&& ch<='z') {while (ch>='a'&& ch<='z'||ch>='0' && ch<='9') { token[m++]=ch; ch=prog[p++]; } syn=10;p--; for (n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) {syn=n+1;break;} } else if(ch>='0' && ch<='9') {while (ch>='0' && ch<='9') {sum=sum*10+(ch-'0'); ch=prog[p++];} syn=11;p--; } else switch(ch) { case '<': 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; default: syn=-1;token[0]=ch; } } E() {printf("E "); T(); E1(); } E1() {printf("E1 "); if (syn==13) { scaner(); T(); E1(); } else { if (syn!=28 && syn!=0) error(); } } T() {printf("T "); F(); T1(); } T1() {printf("T1 "); if (syn==15) { scaner(); F(); T1(); } else { if (syn!=28 && syn!=0 && syn!=13) error(); } } F() {printf("F "); if (syn==27) { scaner(); E(); if(syn==28) scaner(); else error(); } else if (syn==11 || syn==10) scaner(); } error() { printf(" (%d,%s)错误地方! ",syn, token); }