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

📄 word.cpp

📁 这是我在大三是学编译原理时总结出来的删除注释和词法分析
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
# include "dele-rem.cpp"

int reserver(char *);

void main(void)
{
 if(deleremmark()==0)
 {
	 printf("%s\n","编译预处理出错");
     exit(0);
 }
 FILE *input,*output;
 char ss[80];
 char ch,*token=ss;
 int i=0,isReserver=0;
 int count=0;
 /*打开文件*/
 if((input=fopen("middle.txt","rt"))==NULL)
 { printf("file open in readonly mode,but an error generate!\n");
  exit(0);
 }
 if((output=fopen("output.txt","wt"))==NULL)
 {
  printf("file open in new_create mode,but an error generate!\n");
  exit(0);
 }
 
 fprintf(output,"%4s\t(%8s\t  %-16s)\t %4s\n","位置","符号类型","识别符","长度");
printf("dkfkkf");
 ch=fgetc(input);
 while(ch!=EOF)
 {
  i=0;
  /*去掉前导空格,换行符*/
  while((ch==' '||ch=='\n'||ch=='\t')&&ch!=EOF)
   ch=fgetc(input);
  /*字母开头*/
  if(isalpha(ch))
  {
  while(isalpha(ch)||isdigit(ch))
   {
   token[i++]=ch;
   ch=fgetc(input);
   }

  token[i]='\0';
  printf("%s\noooooooooo",token);

  isReserver=reserver(token);
 printf("kkkkkkkk");

  if(isReserver==1)
   {count++;fprintf(output,"%4d\t(标识符\t\t, %-16s)\t%4d\n",count,token,i);}
  else if(isReserver==0)
   {count++;fprintf(output,"%4d\t(保留字\t\t, %-16s)\t%4d\n",count,token,i);}
  else if(isReserver==2)
   {count++;fprintf(output,"%4d\t(算符\t\t, %-16s)\t%4d\n",count,token,i);}
  continue;   
  }
  /*识别数字*/
  else if(isdigit(ch))
   {
    while(isdigit(ch))
    {
    token[i++]=ch;
    ch=fgetc(input);
    }
   /*出现非数字且为点时*/   
   if (ch=='.')
    {
    token[i++]=ch; /*将点加入*/
    ch=fgetc(input);/*读入下一个字符*/
    if (isdigit(ch))
     {
      while(isdigit(ch)) /*是数字时,收入,并将加一*/
      {
      token[i++]=ch;
      ch=fgetc(input);
      }
      /*如果是数字加点再加数字再出现字母时,就是错误*/
      if(isalpha(ch))
      {
       while(isdigit(ch)||isalpha(ch)||ch=='.')
       {
        token[i++]=ch;
        ch=fgetc(input);
       }
       token[i]='\0';
       count++;fprintf(output,"%4d\t(标识错误\t, %-16s)\t%4d\n",count,token,i);
       continue; 
      }
      /*当出现结束符时,就收入为实数内*/
      else
      {
      token[i]='\0';
      count++;fprintf(output,"%4d\t(实数\t\t, %-16s)\t%4d\n",count,token,i);
      continue;
      }
     }
    }
   
   /*如果是字符,则判断为标识错误*/
   else if(isalpha(ch))
    {
     while(isdigit(ch)||isalpha(ch)||ch=='.')      
     {
     token[i++]=ch;
     ch=fgetc(input);
     }
     token[i]='\0';
     count++;fprintf(output,"%4d\t(标识错误\t, %-16s)\t%4d\n",token);
     continue; 
    }
   /*如果是单词段结束符时,就判断为常数*/  
   else
    {
     token[i]='\0';
     count++;fprintf(output,"%4d\t(常数\t\t, %-16s)\t%4d\n",count,token,i);
     continue;
    }
   }     
  else if(ch=='#')
   {
    token[i++]=ch;
    ch=fgetc(input);
    token[i]='\0';
    count++;fprintf(output,"%4d\t(编译预处理符\t, %-16s)\t%4d\n",count,token,i);
    continue;
   } 
	 else if(ch=='(')
   {
    token[i++]=ch;
    ch=fgetc(input);
    token[i]='\0';
    count++;fprintf(output,"%4d\t(右括号运算符\t, %-16s)\t%4d\n",count,token,i);
    continue;
   }
  else if(ch==')')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(左括号运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='[')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(右中括号运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch==']')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(左中括号运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='-')
   {
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='-')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(自加运算符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   else if (ch=='>')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(指针运算符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(负运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='.')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(点运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='&')  
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(地址与运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;   
   }
  else if(ch=='!')  
   {
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='=')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(不等于比较符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(取反运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;   
   }
  else if(ch=='~')  
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(按位运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;   
   }
  else if(ch=='*')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(乘运算符\t, %-16s)\t%4d\t\n",count,token,i);
   continue;   
   }
  else if(ch=='%')  
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(求余运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;   
   }
  else if(ch=='/')  
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(除法运算符\t, %-16s)\t%4d\t\n",count,token,i);
   continue;   
   }  
  else if(ch=='<')
   {
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='=')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(小于等于比较符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   if(ch=='<')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(左移运算符\t, %-16s)\t%4d\t\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(小于比较符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='>')
   {
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='=')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(大于等于比较符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   if(ch=='>')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(右移运算符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(大于比较符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='=')
   {
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='=')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(等于比较符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(赋值运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch==',')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(逗号界符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   } 
  else if(ch==';')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(分号界符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  
  else if(ch=='{')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(边界运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='}')
   {
   token[i++]=ch;
   ch=fgetc(input);
   token[i]='\0';
   count++;fprintf(output,"%4d\t(边界运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='+')
   { 
   token[i++]=ch;
   ch=fgetc(input);
   if(ch=='+')
    {
    token[i++]=ch;
    token[i]='\0';
    count++;fprintf(output,"%4d\t(自加运算符\t, %-16s)\t%4d\n",count,token,i);
    ch=fgetc(input);
    continue;
    }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(加运算符\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  else if(ch=='"')
   { 
   token[i++]=ch;
   ch=fgetc(input);
   while(ch!='"'&&ch!=EOF)
    {
    token[i++]=ch;
    ch=fgetc(input);    
    }
   if(ch=='"')
    {
    token[i++]=ch;
    ch=fgetc(input);
    token[i]='\0';
    count++;fprintf(output,"%4d\t(字符串\t\t, %-16s)\t%4d\n",count,token,i);
    continue;
    }
   else
    {
    while(ch!=EOF)
    {
    token[i++]=ch;
    ch=fgetc(input);
    }
    token[i]='\0';
    count++;fprintf(output,"%4d\t(字符串错误\t, %-16s)\t%4d\n",count,token,i);
    }
   } 
  else
   {
   while(ch!=' '&&ch!='\t'&&ch!='\n'&&ch!=EOF)
   {
    token[i++]=ch;
    ch=fgetc(input);
   }
   token[i]='\0';
   count++;fprintf(output,"%4d\t(无法识别错误\t, %-16s)\t%4d\n",count,token,i);
   continue;
   }
  }
 fclose(input);
 fclose(output);
}

/*判断是不是关键字:
 1,则是标识符
 0,则是关键字
  2,则是运算符
 */

int reserver(char *str)
{
 FILE *fpReserver;
 char tmpStr[80];
 tmpStr[0]='\0';

 if(strcmp(str,"sizeof")==0)
  return 2;
 /*打开关键字文件*/
 if((fpReserver=fopen("keyword.txt","r"))==NULL)
 { printf("file open in readonly mode,but an error generate!\n");
  exit(0);
 }
 while(fscanf(fpReserver,"%s",tmpStr)!=EOF)
 {
	 printf("1--%s\n",str);
	 printf("2--%s\n",tmpStr);

  if(strcmp(str,tmpStr)==0)
   {fclose(fpReserver);return 0;}
 }
 fclose(fpReserver);
 return 1; 
} 

⌨️ 快捷键说明

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