www.pudn.com > WHLE.rar > while.cpp
#include#include #include #define buf 20 #define MAXBUF 255 typedef struct Token { int label; char name[buf]; int code; }Token; typedef struct Symbol_i { int symbol_i; int state; }Symbol_i; int Getsymbol(); void ERROR(); void S(); //S->while (B) S | i=E void B(); //B->E relop E void relop(); //relop->< | = | > void E(); //E->(E)F | iF | nF void F(int A); //F->+EF | -EF | *EF | /EF | ε void F(); char sym,ch; int symbol_L=0,symbol_L1=0,symbol_L2=0,symbol_L3=0,symbol_L4=0; int l,l1,l2,l3,l4; int L_i=0,S_i=0,B_i=0,E_i=0,F_i=0,relop_i=0,i_i=0,n_i=0; int k=0; int re,n=0,t=0; int i1=0,i2=0,i3=0,i4=0; char *wh="while"; Token token1[MAXBUF],token2[MAXBUF]; Symbol_i L[MAXBUF],L1[MAXBUF],L2[MAXBUF],L3[MAXBUF],L4[MAXBUF]; FILE *input; FILE *output; int strcmp(char *s,char *t) { for(;*s==*t;s++,t++) if(*s==0) return 0; return 1; } void main() { if((input=fopen("input.txt","rt"))==NULL) printf("cannot open input file \n"); if((output=fopen("output.txt","wt+"))==NULL) printf("cannot open output file\n"); for(int i=0;i ='a'&&sym<='z')||(sym>='A'&&sym<='Z')) { int h1=0; while((sym>='a'&&sym<='z')||(sym>='A'&&sym<='Z')||sym=='_'||(sym>='0'&&sym<='9')) { token1[t].name[i1++]=sym; n=t; sym=fgetc(input); } h1=strcmp(token1[t].name,wh); t++; i3=i1; i1=0; if(!h1) return 16; //返回while给主程序 else return 13; } //已经取了下一个字符 else if(sym>='0'&&sym<='9') { while(sym>='0'&&sym<='9') { token2[t].name[i2++]=sym; n=t; sym=fgetc(input); } t++; i4=i2; i2=0; return 12; } else if(sym=='/') { sym=fgetc(input); ch='/'; return 1; } else if(sym=='*') { sym=fgetc(input); ch='*'; return 2; } else if(sym=='-') { sym=fgetc(input); ch='-'; return 3; } else if(sym=='+') { sym=fgetc(input); ch='+'; return 4; } else if(sym=='(') { sym=fgetc(input); return 15; } else if(sym==')') { sym=fgetc(input); return 14; } else if(sym=='<') { sym=fgetc(input); ch='<'; return 9; } else if(sym=='=') { sym=fgetc(input); ch='='; return 10; } else if(sym=='>') { sym=fgetc(input); ch='>'; return 11; } else if(sym==';'&&k!=1) { ch=';'; k=1; return 20; break; } else if(k!=1) { sym=fgetc(input); } } return 0; } void S() //S->while (B) S | i=E { re=Getsymbol();//cout< E relop E { cout<<" B"< < | = | > { if(re==9) { cout<<" relop"< "< \n\n"); relop_i++; //cout< (E)F | iF | nF { re=Getsymbol() ;//cout< =0) { if(L[l].state==0) { F(L[l].symbol_i); L[l].state=1; } else { l--; } } } else F(); } else ERROR(); } else if(re==12) { cout<<" E"< +EF | -EF | *EF | /EF | ε { if(re==4) { cout<<" F"<=0) { if(l1[L1].state==0&&L1[l1].symbol_i!=-1) { F(L1[l1].symbol_i); L1[l1].state=1; } else { l1--; } } } else if(re==3) { cout<<" F"<=0&&L2[l2].symbol_i!=-1) { if(L2[l2].state==0) { F(L2[l2].symbol_i); L2[l2].state=1; } else { l2--; } } } else if(re==2) { cout<<" F"<=0&&L3[l3].symbol_i!=-1) { if(L3[l3].state==0) { F(L3[l3].symbol_i); L3[l3].state=1; } else { l3--; } } } else if(re==1) { cout<<" F"<=0&&L4[l4].symbol_i!=-1) { if(L4[l4].state==0) { F(L4[l4].symbol_i); L4[l4].state=1; } else { l4--; } } } else if(re==20) { cout<<" F"<+EF | -EF | *EF | /EF | ε { if(re==4) { cout<<" F"< =0&&L1[l1].symbol_i!=-1) { if(L1[l1].state==0) { F(L1[l1].symbol_i); L1[l1].state=1; } else { l1--; } } } else if(re==3) { cout<<" F"< =0&&L2[l2].symbol_i!=-1) { if(L2[l2].state==0) { F(L2[l2].symbol_i); L2[l2].state=1; } else { l2--; } } } else if(re==2) { cout<<" F"< =0&&L3[l3].symbol_i!=-1) { if(L3[l3].state==0) { F(L3[l3].symbol_i); L3[l3].state=1; } else { l3--; } } } else if(re==1) { cout<<" F"< =0&&L4[l4].symbol_i!=-1) { if(L4[l4].state==0) { F(L4[l4].symbol_i); L4[l4].state=1; } else { l4--; } } } else { cout<<" F"<