www.pudn.com > digui5.rar > digui5.cpp
/* 文法G(S) S-->DGWE G-->c=R R-->dTe|d T-->+|-|*|/ E-->aFb F--> >|< */ #include#include #include #include char a[50],g[50][50]; //a[50]保存输入串,g[50][50]保存四元式 char ch; int i1=0,i2=0,i3=0; //i1通过自加来取得a[i1]输入串中的字符 i2用来选择用哪种四元式,i3用来选择用'W'的报错 int total=0; void S(); void D(); void G(); void W(); void E(); void R(); void T(); void F(); void main() { int p,j=0; char str[20]; printf("请输入do-while语句(D代表do,W代表while),并以#结束:\n"); do{ scanf("%s",str); if(strcmp(str,"do")==0) { a[j]='D'; j++; } else if(strcmp(str,"while")==0) { a[j]='W'; j++; } else if(strcmp(str,"c=d+e")==0) { a[j]='c'; a[j+1]='='; a[j+2]='d'; a[j+3]='+'; a[j+4]='e'; j=j+5; continue; } else if(strcmp(str,"c=d-e")==0) { a[j]='c'; a[j+1]='='; a[j+2]='d'; a[j+3]='-'; a[j+4]='e'; j=j+5; continue; } else if(strcmp(str,"c=d*e")==0) { a[j]='c'; a[j+1]='='; a[j+2]='d'; a[j+3]='*'; a[j+4]='e'; j=j+5; continue; } else if(strcmp(str,"c=d/e")==0) { a[j]='c'; a[j+1]='='; a[j+2]='d'; a[j+3]='/'; a[j+4]='e'; j=j+5; continue; } else if(strcmp(str,"a>b")==0) { a[j]='a'; a[j+1]='>'; a[j+2]='b'; j=j+3; continue; } else if(strcmp(str,"a'; a[j+2]='b'; j=j+3; continue; } else { for(int i=0;i DGWE\n",total);total++;//total用来记数 D(); G(); } void D() { if(ch!='D') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1);} ch=a[++i1]; } void G() { int i=i1+1; if(ch!='c') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1);} if(a[i]!='=') { printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); getchar(); getchar(); exit(1);} printf("%d\tG-->c=R\n",total);total++; R(); } void R() { int i; i=i1+1; i1=i1+2; ch=a[i1]; if(a[i]!='=') { printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); getchar(); getchar(); exit(1); } if(ch!='d') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1); } if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/')) { printf("%d\tR-->dTe\n",total);total++; i2=3; T(); } else { printf("%d\tR-->d\n",total);total++; i2=2; strcpy(g[0],"(=,c,d,_)"); i3=1; W(); E(); } } void T() { ch=a[++i1]; switch(ch) { case '+': printf("%d\tT-->+\n",total);total++; strcpy(g[0],"(+,d,e,T)"); strcpy(g[1],"(=,T,_,c)"); break; case '-': printf("%d\tT-->-\n",total);total++; strcpy(g[0],"(-,d,e,T)"); strcpy(g[1],"(=,T,_,c)"); break; case '*': printf("%d\tT-->*\n",total);total++; strcpy(g[0],"(*,d,e,T)"); strcpy(g[1],"(=,T,_,c)"); break; default: printf("%d\tT-->/\n",total);total++; strcpy(g[0],"(/,d,e,T)"); strcpy(g[1],"(=,T,_,c)"); break; } W(); E(); } void W() { if(i3==1) { ch=a[++i1]; if(ch!='W') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1); } } else{++i1; ch=a[++i1]; if(ch!='W') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1); } } } void E() { ch=a[++i1]; if(ch!='a') { printf("第%d个字符%c为有非法字符请按回车返回!!",i1+1,ch); getchar(); getchar(); exit(1); } printf("%d\tE-->aFb\n",total);total++; F(); } void F() { int i; ch=a[++i1]; i=i1+1; if(a[i]!='b') { printf("第%d个字符%c为有非法字符请按回车返回!!",i+1,a[i]); getchar(); getchar(); exit(1); } if(i2==2) switch(ch) { case '>': printf("%d\tF-->>\n",total);total++; strcpy(g[1],"(j>,a,b,100)"); break; default: printf("%d\tF--> <\n",total);total++; strcpy(g[1],"(j<,a,b,100)"); break; } else if(i2==3) switch(ch) { case '>': printf("%d\tF--> >\n",total);total++; strcpy(g[2],"(j>,a,b,100)"); break; default: printf("%d\tF--> <\n",total);total++; strcpy(g[2],"(j<,a,b,100)"); break; } ch='#'; }