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

📄 zhaoshiwei.c

📁 纯c语言实现的词法分析器。可以输出token串以及符号表。状态转移比较明确。最后结果通过文件输出
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#define N 50
#define M 500

char *a[34]={"auto","break","case","char","const","continue","default","do",
             "double","else","enum","extern","float","for","goto","if",
             "int","long","main","printf","register","return","short","signed","sizeof","static",
            "struct","switch","typedef","union","unsigned","void","while","volatile"};
char *b[13]={"&&","||","++","--","+","-","*","/","=",">=","<=","==","!="};
char *c[11]={"[","]","{","}","(",")",",",";","'","#",";"};

char scmp(char *str)             /*此函数判断单词类型*/
{
   int i;
   for(i=0;i<34;i++)               /*a中的关键字*/
   {
      if(strcmp(str,a[i])==0)
      return 'K';
   }
   for(i=0;i<13;i++)              /*b 中的符号*/
   {
      if(strcmp(str,b[i])==0)
      return 'A';
   }
   for(i=0;i<11;i++)             /*c中符号*/
   {
      if(strcmp(str,c[i])==0)
      return 'R';
   }
   if(isdigit(str[0]))  /*0-9是数字返回num*/
   {
   return 'N';
   }
   /*一般的变量与字符*/
   if(!isalnum(str[0]))
   return 'R';
   else return 'C';/*变量*/
}

void main(void)
{
   FILE *in,*out,*fp,*table, *test;
   char ch,cha,buffer[N],*link[M],link2[M][32];
   int i=0,j=0,k,numLink=0;
   if((in=fopen("source.txt","r+"))==NULL)
   {
      printf("source.txt can't open or doesn't exist...\n");
      getch();exit(0);
   }
   if((out=fopen("token.txt","w+"))==NULL)
   {
      printf("output file can not open...\n");
      getch();exit(0);
   }

   if((table=fopen("table.txt","w+"))==NULL)
   {
      printf("output file can not open...\n");
      getch();exit(0);
   }

   while(!feof(in))
   {
      ch=fgetc(in);
      if(ch=='\t' || ch==' ' || ch== '\n')
        continue;
      if(isalpha(ch))                    /*如果首字符是字母*/
      {
         while(isalpha(ch)&&(i<N))    
         {
            buffer[i++]=ch;
            ch=fgetc(in);
         }
         
         buffer[i]='\0';
         link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
         strcpy(link[j-1],buffer);
         i=0;
         fseek(in,-1L,1);
      }
      else if(isdigit(ch))              /*如果首字符是数字*/
      {
         while(isdigit(ch)&&(i<N))       
         {
            buffer[i++]=ch;
            ch=fgetc(in);
         }

         buffer[i]='\0';
         link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
         strcpy(link[j-1],buffer);
         i=0;
         fseek(in,-1L,1);
      }
      else if(!isalnum(ch))               /*如果首字符既不是数字也不是字母的话*/
      {
         if(ch!='\n'&&ch!=' ')
         {
            if(ch=='>'||ch=='<'||ch=='!')      /* 以下代码实现超前搜索 */
            {
               if((cha=fgetc(in))=='=')
               {
                  buffer[i++]=ch;
                  buffer[i++]=cha;buffer[i]='\0';
                  link[j++]=(char *)malloc(sizeof(char)*3);
                  strcpy(link[j-1],buffer);
                  i=0;
               }
               else
               {
                  buffer[i++]=ch;buffer[i]='\0';
                  link[j++]=(char *)malloc(sizeof(char)*2);
                  strcpy(link[j-1],buffer);
                  i=0;
                  fseek(in,-1L,1);
               }
            }
            else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=')
            {
               if((cha=fgetc(in))==ch)
               {
                 buffer[i++]=ch;buffer[i++]=cha;buffer[i]='\0';
                 link[j++]=(char *)malloc(sizeof(char)*3);
                 strcpy(link[j-1],buffer);
                 i=0;
               }
               else
               {
                  buffer[i++]=ch;buffer[i]='\0';
                  link[j++]=(char *)malloc(sizeof(char)*2);
                  strcpy(link[j-1],buffer);
                  i=0;
                  fseek(in,-1L,1);
               }
            }
            else
            {
               buffer[i++]=ch;buffer[i]='\0';
               link[j++]=(char *)malloc(sizeof(char)*2);
               strcpy(link[j-1],buffer);
               i=0;
            }
         }
      }
   }
   numLink = j-1;

     k = 0;
     for(i=0;i<numLink;i++)
     {
      for(j=0;j<i;j++)
      {
      if(strcmp(link[i],link[j])==0)
      break;
      } 
      if(i==j)
      {
      /*link2[k]==(char*)(malloc)(32*sizeof(char));*/
      strcpy(link2[k++],link[i]); 
      }
     }
 fprintf(out,"************************\n");
   fprintf(out,"K means keyword \n");
   fprintf(out,"A means addop\n");
   fprintf(out,"R means relop\n");
   fprintf(out,"N means num\n");
   fprintf(out,"C means id\n");
   fprintf(out,"************************\n");

 for(i=0;i<numLink;i++)
     {
      cha=scmp(link[i]);  /*判断单词的类型*/
      fputc('(',out);
      fputc(cha,out);
      fputc(',',out);
      fputs(link[i],out);

      for(j=0;j<k;j++)
      {
      if(strcmp(link[i],link2[j])==0)
      {
      fputc(',',out);
      fprintf(out,"%d",j);
      fputc(')',out);
      fputc('\n',out);

      }

      } 

     }



     for(i=0;i<k;i++)
     {
      cha=scmp(link2[i]);
      if(cha=='A'||cha=='R')/*符号 在符号表中保留*/
      {
       fputc('(',table);
       fputs(link2[i],table);
       fputc(',',table);
       fputs(link2[i],table);
       fputc(',',table);
       fprintf(table,"%d",i);
       fputc(')',table);
       fputc('\n',table);
      }
      if(cha=='N'||cha=='C') /*数字和变量 均替换为id*/
      {
       fputc('(',table);
       fputs(link2[i],table);
       fputc(',',table);
       fputs("id",table);
       fputc(',',table);
       fprintf(table,"%d",i);
       fputc(')',table);
       fputc('\n',table);
      }
      if(cha=='K')/*关键字不变*/
      {
       fputc('(',table);
       fputs(link2[i],table);
       fputc(',',table);
       fputs(link2[i],table);
       fputc(',',table);
       fprintf(table,"%d",i);
       fputc(')',table);
       fputc('\n',table);
      }
          /*输出*/
     }

  getch();
  return;
}

⌨️ 快捷键说明

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