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

📄 cifafenxi.cpp

📁 编译原理实验之词法分析器
💻 CPP
字号:
#include<iostream>
#include<conio.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#define N 50
#define M 500
using namespace std;

char *a[7]={"main","if","else","int","return","void","while"};
char *b[10]={"=","+","-","*","/","<","<=",">",">=","!="};
char *c[9]={"、",";",":","{","}","[","]","(",")"};

char scmp(char *str)             /*此函数判断单词类型*/
{
   int i;
   for(i=0;i<6;i++)
   {
      if(strcmp(str,a[i])==0)  /*strcmp是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值. 
                                 比较两个字符串的算法是:逐个比较两个串中对应的字符,字符大小按照ASCII码值确定,从左向右比较,如果遇到不同字符,
                                 所遇第一对不同字符的大小关系就确定了两个字符串的大小关系,如果未遇到不同字符而某个字符串首先结束,那么这个字
                                 符串是较小的,否则两个字符串相等。*/                          
      return '1';
   }
   if(isdigit(str[0]))
   return '3';
   for(i=0;i<9;i++)
   {
      if(strcmp(str,b[i])==0)
      return '4';
   }
   for(i=0;i<8;i++)
   {
      if(strcmp(str,c[i])==0)
      return '5';
   }
   if(!isalnum(str[0]))       /*isalnum()函数当参数是数字或者字母的时候返回非0值,其它是0*/ 
   return '5';
   else return '2';
}

int main()
{
   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");
      getch();exit(0);
   }
   if((out=fopen("output.txt","w+"))==NULL)
   {
      printf("output file can not open...\n");
      getch();exit(0);
   }
   /**************************以下是核心代码区**************************/
   while(!feof(in))  /*feof函数的功能是检测流上的文件结束符。一般格式为:feof(FILE * stream);
                      它是一个用于检测给定流的文件结束符的宏。如果设置了文件结束符,则文件读操作
                      将返回文件结束符,直到调用了rewind函数或文件关闭。如果在指定流上的最后一次输入
                      操作中检测到文件结束符,该函数将返回非0值,否则返回0。*/
   {
      ch=fgetc(in);
      if(isalpha(ch))                    /*如果首字符是字母,函数:isalpha,原型:int isalpha(int ch),用法:头文件加入#include <ctype.h>
                                        ,功能:判断字符c是否为英文字母,当c为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(c)||islower(c)”
                                        做测试,返回非零值,否则返回零。*/

      {
         while(isalnum(ch)&&(i<N))  /*函数:isalnum,头文件:ctype.h,功能:如果本函数的变元为字母或数字,它将返回非零值,否则返回零值。*/

         {
            buffer[i++]=ch;
            ch=fgetc(in); /*函数名: fgetc,功 能: 从流中读取字符,用 法: int fgetc(FILE *stream);*/

         }
         if(i>=N)
         {
            printf("the string is too long...\n");
            getch();exit(0);
         }
         buffer[i]='\0';
         zhou[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
         strcpy(zhou[j-1],buffer);
         i=0;
         fseek(in,-1L,1);    /*函数名: fseek,功 能: 重定位流上的文件指针,用 法: int fseek(FILE *stream, long offset, int fromwhere);
                            描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。
                             如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
                           返回值: 成功,返回0,否则返回其他值。*/
      }
      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");
            getch();exit(0);
         }
         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);   /*原型:extern char *strcpy(char *dest,char *src);用法:#include <string.h>
                                            功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
                                           说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
                                             返回指向dest的指针。*/
                 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,功 能: 送一个字符到一个流中,用 法: int fputc(int ch, FILE *stream);*/
    fputc(cha,out);
    fputc(',',out);
    fputs(zhou[i],out);  /* 函数名: fputs,功 能: 送一个字符串到一个流中,用 法: int fputs(char *string, FILE *stream);*/
    fputc(')',out);
    fputc('\n',out);
  }
  getch();
  return 0;
}



⌨️ 快捷键说明

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