⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3.c

📁 c—语言的句法分析器。读入一个C--语言程序
💻 C
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
#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)&&strcmp(token,keyword[n]))n++;
      if(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");
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -