#include <stdio.h> #include <string.h> char prog[80], token[8]; char ch; int syn, p, m, n, sum, kk=0; char *rwtab[6]={"begin", "if", "then", "while", "do", "end"}; void scaner(); void E(); void Y(); void T(); void B(); void C(); void A(); void main() { p=0; printf("Please input string:\n"); do { scanf("%c", &ch); prog[p++]=ch; }while(ch!='#'); //当遇到‘#’,结束输入 p=0; scaner(); E(); } void scaner() { for(n=0; n<8; n++) token[n]=NULL; ch=prog[p++]; while(ch==' '||ch=='\n') ch=prog[p++]; m=0; 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++]; // 将prog数组的字母复制到ch数组中 } token[m++]='\0'; //把token的末尾设置结束符\0 p--;//标记到当前token数组中不是字母的当前位置 syn=10;//标记字母的对应码 for(n=0; n<6; n++) { if(strcmp(token, rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码 { syn=n+1; break; } } } else if(ch>='0'&&ch<='9') { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0';//number用来记录所对应的数字 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 '>': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; //标记”>=”的对应码 token[m++]=ch; } else { syn=23;//标记”>”的对应码 p--; } break; case ':': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18;//标记”:=”的对应码 token[m++]=ch; } else { syn=17;//标记”:”的对应码 p--; } break; case '+': syn=13;//标记”+”的对应码 token[m++]=ch; break; case '-': syn=14;//标记”-”的对应码 token[m++]=ch; break; case '*': syn=15;//标记”*”的对应码 token[m++]=ch; break; case '/': syn=16;//标记”/”的对应码 token[m++]=ch; break; case '=': syn=25;//标记”=”的对应码 token[m++]=ch; break; case ';': syn=26;//标记”;”的对应码 token[m++]=ch; break; case '(': syn=27;//标记”(”的对应码 token[m++]=ch; break; case ')': syn=28;//标记”)”的对应码 token[m++]=ch; break; case '#': syn=0;//标记”#”的对应码 token[m++]=ch; break; default: syn=-1;//当不是上述字母,数字,符号时,设置 syn=-1; } token[m++]='\0'; } } void A() { if(syn==10 || syn==11) { scaner(); } else if(syn==27) { scaner(); B(); if(syn==28) scaner(); else { kk=1; printf("ERROR: )错误\n"); } } else { kk=1; printf("ERROR: 表达式错误\n"); } } void C() { A(); while(syn==15 || syn==16) { scaner(); A(); } } void B() { C(); while(syn==13 || syn==14) { scaner(); C(); } } void T() { if(syn==10) { scaner(); if(syn==18) { scaner(); B(); } else { kk=1; printf("ERROR: 赋值号错误\n"); } } else { kk=1; printf("ERROR: 语句错误\n"); } } void Y() { B(); while(syn==26) { scaner(); B(); } } void E()//程序 { if(syn==1) { scaner(); Y(); if(syn==6) { scaner(); if(syn==0 && kk==0) printf("success!\n"); else if(syn!=0 && kk==0) { kk=1; printf("ERROR: END后未正常结束\n"); } } else { if(kk!=1) { kk=1; printf("ERROR: 缺少end\n"); } } } else { kk=1; printf("ERROR: begin错误\n"); } }