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

📄 lex.cpp

📁 由VC++构建的词法分析器,实现简单的词法分析器
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <malloc.h>
#define N 50
#define M 500

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

char scmp(char *str)             /*此函数判断单词类型*/
{
   int i;
   for(i=0;i<32;i++)
   {
      if(strcmp(str,a[i])==0)
      return '1';
   }
   if(isdigit(str[0]))
   return '3';
   for(i=0;i<13;i++)
   {
      if(strcmp(str,b[i])==0)
      return '4';
   }
   for(i=0;i<9;i++)
   {
      if(strcmp(str,c[i])==0)
      return '5';
   }
   if(!isalnum(str[0]))
   return '5';
   else return '2';
}

void main(void)
{
   FILE *in,*out,*fp;
   char ch,cha,buffer[N],*zhou[M];
   int i=0,j=0,k;
   if((in=fopen("source.txt","r+"))==NULL)
   {
      printf("source.txt can't open or doesn't exist...\n");
      
   }
   if((out=fopen("output.txt","w+"))==NULL)
   {
      printf("output file can not open...\n");
      
   }
   /**************************以下是核心代码区**************************/
   while(!feof(in))
   {
      ch=fgetc(in);
      if(isalpha(ch))                    /*如果首字符是字母*/
      {
         while(isalnum(ch)&&(i<N))
         {
            buffer[i++]=ch;
            ch=fgetc(in);
         }
         if(i>=N)
         {
            printf("the string is too long...\n");
            
         }
         buffer[i]='\0';
         zhou[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
         strcpy(zhou[j-1],buffer);
         i=0;
         fseek(in,-1L,1);
      }
      else if(isdigit(ch))              /*如果首字符是数字*/
      {
         while(isdigit(ch)&&(i<N))
         {
            buffer[i++]=ch;
            ch=fgetc(in);
         }
         if(i>=N)
         {
            printf("the digit is too long...\n");
            
         }
         buffer[i]='\0';
         zhou[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
         strcpy(zhou[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';
                  zhou[j++]=(char *)malloc(sizeof(char)*3);
                  strcpy(zhou[j-1],buffer);
                  i=0;
               }
               else
               {
                  buffer[i++]=ch;buffer[i]='\0';
                  zhou[j++]=(char *)malloc(sizeof(char)*2);
                  strcpy(zhou[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';
                 zhou[j++]=(char *)malloc(sizeof(char)*3);
                 strcpy(zhou[j-1],buffer);
                 i=0;
               }
               else
               {
                  buffer[i++]=ch;buffer[i]='\0';
                  zhou[j++]=(char *)malloc(sizeof(char)*2);
                  strcpy(zhou[j-1],buffer);
                  i=0;
                  fseek(in,-1L,1);
               }
            }
            else
            {
               buffer[i++]=ch;buffer[i]='\0';
               zhou[j++]=(char *)malloc(sizeof(char)*2);
               strcpy(zhou[j-1],buffer);
               i=0;
            }
         }
      }
   }
   /**************************以上是核心代码区**************************/


  for(i=0;i<j-1;i++)       /*输出到文件*/
  {
    puts(zhou[i]);
    cha=scmp(zhou[i]);
    fputc('(',out);
    fputc(cha,out);
    fputc(',',out);
    fputs(zhou[i],out);
    fputc(')',out);
    fputc('\n',out);
  }
  return;
}


⌨️ 快捷键说明

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