#include<stdio.h> #include<string.h> #include<stdlib.h> char prog[]="(a+b)*2",token[20]; char ch; int syn,p,m,n,sum; char *rwtab[6]={"begin","if","then","while","do","end" }; void E(); void T(); void E1(); void T1(); void F(); void error(); void scaner(){ m=0; for(n=0; n<8; n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')) { while((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; syn=10; p=p-1; //回退一个字符 for(n=0; n<6; n++) { if(strcmp(token,rwtab[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=p-1; 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=p-1; } p=p+1; token[m]='\0'; break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p=p-1; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p=p-1; } 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=26; token[0]=ch; break; case '(': syn=27; token[0]=ch; break; case ')': syn=28; token[0]=ch; break; case '=': syn=25; token[0]=ch; break; case '#': syn=0; token[0]=ch; break; default: syn=-1; } } } void E() { T(); E1(); } void E1() { if(syn == 13){ scaner(); T(); E1(); }else if(syn ==0 || syn==20){ }else error(); } void T(){ F(); T1(); } void T1(){ if(syn ==15){ scaner(); F(); T1(); }else if (syn==0|| syn==13){ }else error(); } void F(){ if(syn==27){ scaner(); E(); if(syn==28) scaner(); else error; }else if (syn ==11 ||syn ==10) scaner(); else error(); } void error(){ printf("\n(%s,出错)",token); } main() { scaner(); E(); }
#include<stdio.h>#include<string.h>#include<stdlib.h>
char prog[]="(a+b)*2",token[20];char ch;int syn,p,m,n,sum;char *rwtab[6]={"begin","if","then","while","do","end" };
void E();void T();void E1();void T1();void F();void error();
void scaner(){m=0; for(n=0; n<8; n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')) { while((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; syn=10; p=p-1; //回退一个字符 for(n=0; n<6; n++) { if(strcmp(token,rwtab[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=p-1; 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=p-1; } p=p+1; token[m]='\0'; break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p=p-1; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p=p-1; } 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=26; token[0]=ch; break; case '(': syn=27; token[0]=ch; break; case ')': syn=28; token[0]=ch; break; case '=': syn=25; token[0]=ch; break; case '#': syn=0; token[0]=ch; break; default: syn=-1; }}}
void E(){T();E1();}
void E1(){if(syn == 13){scaner();T();E1();}else if(syn ==0 || syn==20){}else error();}
void T(){F();T1();}
void T1(){if(syn ==15){scaner();F();T1();}else if (syn==0|| syn==13){}else error();}
void F(){if(syn==27){scaner();E();if(syn==28) scaner();elseerror;}else if (syn ==11 ||syn ==10)scaner();elseerror();}
void error(){printf("\n(%s,出错)",token);}main(){scaner();E();}