www.pudn.com > LL1.rar > LL1.C
# include# include static char blank[7][9][4]= {{"eT","","","","","eT"}, {"","eT+","eT-","","","","#","","#"}, {"tF","","","","","tF"}, {"","#","#","tF*","tF/","","#","","#"}, {"fP","","","","","fP"}, {"","#","#","#","#","","#","F^","#"}, {"i","","","","",")E("}}; FILE * in, *out; char mark[128]={'#'}, rs[128],instr[32][32]; int i, j; input() { int a=0, b=0, c=0; while(1) { fscanf(in,"%s",rs); if(rs[1]=='k') continue; else { if(rs[1]=='-') a=3; else a=7; for(c=0;rs[a]!='\0';a++) instr[b][c++]=rs[a]; instr[b][--c]='\0'; if((instr[0][0]=='#')&&(instr[b][0]=='\\')&&(instr[b][1]=='n')) { b=0; break; } if((instr[b][0]==';')||(instr[b][0]==',') ||(instr[b][0]=='{')||(instr[b][0]=='}')) { b--; break; } if(instr[b][0]=='\\') switch(instr[b][1]) { case 'n' : case 'b' : case 't' : case 'r' : case 'f' : break; default : b++; } else b++; continue; } } instr[++b][0]='#'; instr[b+1][0]='\0'; } getiv(int top1) { switch(mark[top1]) { case 'E' : i=0; break; case 'e' : i=1; break; case 'T' : i=2; break; case 't' : i=3; break; case 'F' : i=4; break; case 'f' : i=5; break; case 'P' : i=6; } } getjv(top2) { if((instr[top2][0]>='A'&&instr[top2][0]<='Z') ||(instr[top2][0]>='a'&&instr[top2][0]<='z') ||(instr[top2][0]=='_'&&instr[top2][0]!='\0')) { j=0; return 0; } if(strcmp(instr[top2],"+")==0) { j=1; return 0; } if(strcmp(instr[top2],"-")==0) { j=2; return 0; } if(strcmp(instr[top2],"*")==0) { j=3; return 0; } if(strcmp(instr[top2],"/")==0) { j=4; return 0; } if(strcmp(instr[top2],"(")==0) { j=5; return 0; } if(strcmp(instr[top2],")")==0) { j=6; return 0; } if(strcmp(instr[top2],"^")==0) { j=7; return 0; } if(strcmp(instr[top2],"#")==0) { j=8; return 0; } else j=9; return 0; } error() { int k; fprintf(out,"%s ","Error :"); for(k=0;instr[k][0]!='#';k++) fprintf(out,"%s ",instr[k]); fputc('\n',out); } main(int argc, char argv[]) { int top1, top2, k, flag; char filename1[32],filename2[32]; if (argc==1) { printf("Input source filename:"); scanf("%s",filename1); printf("Input target filename:"); scanf("%s",filename2); } else { sprintf(filename1,"%s",argv[1]); sprintf(filename2,"%s",argv[2]); } if ((in=fopen(filename1,"r"))==NULL) { printf("error: can not open source file!\n"); exit(0); } if ((out=fopen(filename2,"w"))==NULL) { printf("error: can not open target file!\n"); exit(0); } while(!feof(in)) { mark[1]='E'; top1=1; top2=flag=0; input(); getjv(top2); if(instr[0][0]=='#') continue; do { switch(mark[top1]) { case 'i' : if((instr[top2][0]>='A'&&instr[top2][0]<='Z') ||(instr[top2][0]>='a'&&instr[top2][0]<='z') ||(instr[top2][0]=='_'&&instr[top2][0]!='\0')) { mark[top1--]='\0'; getjv(++top2); } else { top1=0; flag=1; } break; case '+' : case '-' : case '*' : case '/' : case '(' : case ')' : case '^' : if(strcmp(instr[top2],&mark[top1])==0) { mark[top1--]='\0'; getjv(++top2); } else { top1=0; flag=1; } break; default : getiv(top1); if(j==9) { top1=0; flag=1; } else { for(k=0;(blank[i][j][k]!='\0') &&(blank[i][j][k]!='#');) mark[top1++]=blank[i][j][k++]; if(blank[i][j][0]=='\0') { top1=0; flag=1; } else mark[top1--]='\0'; } } }while(mark[top1]!='#'); if(flag==0&&instr[top2][0]=='#') { fprintf(out,"%s ","Identify :"); for(k=0;instr[k][0]!='#';k++) fprintf(out,"%s ",instr[k]); fputc('\n',out); } else error(); } fclose(in); fclose(out); }