www.pudn.com > jufafenxi.rar > 3.c


#include 
#include 
#include 
#include 
#define keywordSum 12 
char *keyword[keywordSum]={"if","else","return","min","void","main","for","while","do","int","read","write"}; 
char singleword[50]="+-*(){};,:"; 
char doubleword[10]="><=!"; 
int TESTscan(); 
char Scanin[300],Scanout[300]; 
int TESTparse(); 
int program(); 
int compoud_Stat(); 
int statement(); 
int expression_stat(); 
int expression(); 
int bool_expr(); 
int additive_expr(); 
int term(); 
int factor(); 
int if_stat(); 
int while_stat(); 
int for_stat(); 
int write_stat(); 
int read_stat(); 
int declaration_stat(); 
int declaration_list(); 
int statement_list(); 
int compound_stat(); 
char token[20],token1[40]; 
extern char Scanout[300]; 
FILE *fp; 
FILE *fin,*fout; 
// 
int TESTscan() 
{ 
  char ch,token[40]; 
  int es=0,j,n; 
  printf("请输入源程序的路径:"); 
  scanf("%s",Scanin); 
  printf("请输入词法分析输出的路径:");  
  scanf("%s",Scanout); 
  if((fin=fopen(Scanin,"r"))==NULL) 
  { 
    printf("\n打开词法分析输入文件出错!!\n");  
    return(1);   
  }  
  if((fout=fopen(Scanout,"w"))==NULL) 
  { 
    printf("\n创建词法分析输出文件出错!!\n");  
    return(2);     
  } 
  ch=getc(fin); 
  while(ch!=EOF) 
  { 
    while(ch==' '||ch=='\n'||ch=='\t')ch=getc(fin); 
    if(isalpha(ch)) 
    { 
      token[0]=ch;j=1; 
      ch=getc(fin); 
      while(isalnum(ch)) 
      { 
        token[j++]=ch; 
        ch=getc(fin); 
      } 
      token[j]='\0'; 
      n=0; 
      while((n=keywordSum) 
        fprintf(fout,"%s\t%s\n","ID",token); 
      else 
        fprintf(fout,"%s\t%s\n",token,token);       
         
    }else if(isdigit(ch)) 
    { 
      token[0]=ch;j=1; 
      ch=getc(fin); 
      while(isdigit(ch)) 
      { 
        token[j++]=ch; 
        ch=getc(fin); 
      } 
      token[j]='\0'; 
      fprintf(fout,"%s\t%s\n","NUM",token);     
    }else if(strchr(singleword,ch)>0) 
    { 
     token[0]=ch;token[1]='\0'; 
     ch=getc(fin); 
     fprintf(fout,"%s\t%s\n",token,token);      
    }else if(strchr(doubleword,ch)>0) 
    { 
     token[0]=ch; 
     ch=getc(fin); 
     if(ch=='=') 
     { 
       token[1]=ch;token[2]='\0'; 
       ch=getc(fin); 
     }else 
       token[1]='\0'; 
     fprintf(fout,"%s\t%s\n",token,token);        
    }else if(ch=='/') 
     { 
     ch=getc(fin); 
     if(ch=='*') 
     { 
       char ch1; 
       ch1=getc(fin); 
       do 
       { 
         ch=ch1;ch1=getc(fin); 
       } 
       while((ch!='*'||ch!='/')&&ch1!=EOF); 
       ch=getc(fin); 
       
     }else 
     { 
       token[0]='/';token[1]='\0'; 
       fprintf(fout,"%s\t%s\n",token,token);       
        
     } 
     }else 
     { 
      token[0]=ch;token[1]='\0'; 
      ch=getc(fin); 
      es=3; 
      fprintf(fout,"%s\t%s\n","ERROR",token);       
     } 
  } 
  fclose(fin); 
  fclose(fout); 
  return(es);       
} 
// 
int TESTparse() 
{ 
   int es=0; 
   if((fp=fopen(Scanout,"r"))==NULL) 
   { 
   printf("\n打开%s错误!\n",Scanout); 
   es=10; 
   } 
   if(es==0)es=program(); 
   printf("=====语法分析错误!=====\n"); 
   switch(es) 
   { 
     case 0:printf("语法分析成功!\n");break; 
     case 10:printf("打开文件%s失败\n",Scanout);break; 
     case 1:printf("缺少{!\n");break; 
     case 2:printf("缺少}!\n");break; 
     case 3:printf("缺少标志符!\n");break; 
     case 4:printf("缺少分号!\n");break; 
     case 5:printf("缺少(!\n");break; 
     case 6:printf("缺少)!\n");break; 
     case 7:printf("缺少操作数!\n");break; 
      
   } 
   fclose(fp); 
   return(es);  
} 
// 
int program() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  if(strcmp(token,"{")) 
  { 
    es=1; 
    return(es); 
      } 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  es=declaration_list(); 
  if(es>0)return(es); 
  es=statement_list(); 
  if(es>0)return(es);   
  if(strcmp(token,"}")) 
  { 
    es=2; 
    return(es); 
     
  } 
  return(es); 
} 
// 
 
int declaration_list() 
{ 
  int es=0; 
  while(strcmp(token,"int")==0) 
  { 
    es=declaration_stat(); 
    if(es>0)return(es); 
     
  } 
  return(es); 
   
} 
// 
 
int declaration_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);   
  if(strcmp(token,"ID"))return(es=3); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  if(strcmp(token,";"))return(es=4); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  return(es); 
     
} 
// 
 
int statement_list() 
{ 
  int es=0; 
  while(strcmp(token,"}")) 
  { 
    es=statement(); 
    if(es>0)return(es); 
  } 
  return(es); 
} 
// 
 
int statement() 
{ 
  int es=0; 
  if(es==0&&strcmp(token,"if")==0)es=if_stat(); 
  if(es==0&&strcmp(token,"while")==0)es=while_stat(); 
  if(es==0&&strcmp(token,"for")==0)es=for_stat(); 
  if(es==0&&strcmp(token,"read")==0)es=read_stat(); 
  if(es==0&&strcmp(token,"write")==0)es=write_stat(); 
  if(es==0&&strcmp(token,"{")==0)es=compound_stat(); 
  if(es==0&&strcmp(token,"ID")==0||strcmp(token,"NUM")==0) 
  es=expression_stat(); 
    return(es); 
} 
// 
 
int if_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  if(strcmp(token,"("))return(es=5); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=expression(); 
  if(es>0)return(es); 
  if(strcmp(token,")"))return(es=6);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=statement(); 
  if(es>0)return(es); 
  if(strcmp(token,"else")==0) 
  { 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=statement(); 
  if(es>0)return(es); 
  } 
  return(es); 
} 
// 
 
int while_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  if(strcmp(token,"("))return(es=5); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=expression(); 
  if(es>0)return(es); 
  if(strcmp(token,")"))return(es=6);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=statement(); 
  return(es); 
} 
 
// 
 
int for_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  if(strcmp(token,"("))return(es=5); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=expression(); 
  if(es>0)return(es);  
  if(strcmp(token,";"))return(es=4);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  es=expression(); 
  if(es>0)return(es);  
  if(strcmp(token,";"))return(es=4);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=expression(); 
  if(es>0)return(es);  
  if(strcmp(token,")"))return(es=6); 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  es=statement(); 
  return(es);   
} 
// 
 
int write_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  es=expression(); 
  if(es>0)return(es);  
  if(strcmp(token,";"))return(es=4);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  return(es);   
} 
// 
 
int read_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  if(strcmp(token,"ID"))return(es=3);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1); 
  if(strcmp(token,";"))return(es=4);  
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  return(es);  
} 
// 
 
 
int compound_stat() 
{ 
  int es=0; 
  fscanf(fp,"%s%s\n",&token,&token1); 
  printf("%s%s\n",token,token1);  
  es=statement_list(); 
  return(es);   
} 
// 
 
int expression_stat() 
{ 
  int es=0; 
  if(strcmp(token,";")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1);  
    return(es); 
  }  
  es=expression(); 
  if(es>0)return(es);  
  if(es==0&&strcmp(token,";")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1);  
    return(es);   
  }else 
  { 
  es=4; 
  return(es);    
  }    
} 
// 
 
int expression() 
{ 
  int es=0,fileadd; 
  char token2[20],token3[40]; 
  if(strcmp(token,"ID")==0) 
  { 
    fileadd=ftell(fp); 
    fscanf(fp,"%s%s\n",&token2,&token3); 
    printf("%s%s\n",token2,token3);  
    es=bool_expr(); 
    if(es>0)return(es);             
    if(strcmp(token2,"=")==0) 
    { 
      fscanf(fp,"%s%s\n",&token,&token1); 
      printf("%s%s\n",token,token1);    
    }else 
    { 
      fseek(fp,fileadd,0); 
      printf("%s%s\n",token,token1); 
      es=bool_expr(); 
      if(es>0)return(es);             
    }     
  } 
    return(es); 
} 
// 
 
int bool_expr() 
{ 
  int es=0; 
  es=additive_expr(); 
  if(es>0)return(es);  
  if(strcmp(token,">")==0||strcmp(token,">=")==0 
  ||strcmp(token,"<")==0||strcmp(token,"<=")==0 
  ||strcmp(token,"==")==0||strcmp(token,"!=")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1); 
    es=additive_expr(); 
    if(es>0)return(es);    
  } 
   return(es); 
} 
// 
 
int additive_expr() 
{ 
  int es=0; 
  es=term(); 
  if(es>0)return(es); 
  while(strcmp(token,"+")==0||strcmp(token,"-")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1); 
    es=term(); 
    if(es>0)return(es);   
  } 
  return(es);    
} 
// 
 
int term() 
{ 
  int es=0; 
  es=factor(); 
  if(es>0)return(es); 
  while(strcmp(token,"*")==0||strcmp(token,"/")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1); 
    es=factor(); 
    if(es>0)return(es); 
  } 
  return(es);     
} 
// 
 
 
int factor() 
{ 
  int es=0; 
  if(strcmp(token,"(")==0) 
  { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1); 
    es=expression(); 
    if(es>0)return(es); 
    if(strcmp(token,")")==0)return(es=6); 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1);         
  }else 
  { 
   if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0)  
   { 
    fscanf(fp,"%s%s\n",&token,&token1); 
    printf("%s%s\n",token,token1); 
    return(es);    
   }else 
   { 
   es=7; 
   return(es); 
   } 
  } 
  return(es); 
} 
// 
 
 
void main() 
{ 
  int es=0; 
  es=TESTscan(); 
  if(es>0){ printf("词法分析错误,编译停止!");} 
  else {printf("词法分析成功!\n");} 
  if(es==0) 
  { 
    es=TESTparse(); 
    if(es=0)printf("语法分析成功!\n"); 
    else printf("语法分析错误!\n"); 
  } 
}