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); 
}