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

📄 cifafenxi.c

📁 不是专业的词法分析 只适合编译原理课程设计(再难就不像是学生做的了)
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ==================================================================*/
/*~~~~~~~~~~~先鄙视下那些不排队检查作业的人们~~~~~~~~~~~~~~~~~~~~~~~~*/
/*实现的功能:
        1:注释部分和空白的排出,并实现输出的注释部分的功能~
        2:关键字写外部的文件里,可以不用修改程序就可以
           添加关键字~
        3:简单的错误判断,比如***的表示~
        4:文件的输出out.txt,能输出助记符,种别编码,行号和代码内容~
        5:错误的内容输出,对与检查出来的错误,输出为error.txt,其中
           包括了错误所在的行,及错误类型信息~
        6: 符号表和常量表各自输出在fuhao.txt和clb.txt~ */
/*~~~~~~~~~~再次鄙视下那些不排队检查作业的人们~~~~~~~~~~~~~~~~~~~~~~~*/
/*===================================================================*/

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
int hang=1; /*  用来输出所在的行 */
/* /* ////////////////////////////////////////////////////////////////////// */ */

/* 下滑线判断 */
int xiahuaxian_(char ch)
 {
    if(ch=='_') return 1 ;
    return 0;
 }
/* /////////////////////////////////////////////////////////////////////////// */
/* 字母判断 */
int Pha(char ch)
 {
    if(isalpha(ch)) return 1;
    return 0;
  }
/* /////////////////////////////////////////////////////////////////////////// */
/* 数字判断 */
int Num(char ch)
 {
    if(isalnum(ch)) return 1;
    return 0;
 }
/* /////////////////////////////////////////////////////////////////////////// */
 /* 空格判断 */
int Space(char ch)
 {
    if(ch==' ') return 1;
    return 0;
 }
/* ////////////////////////////////////////////////////////////////////////// */
/* 读取下个字符 */
void GetAChar(FILE *fp,char *ch)
 {
    *ch = fgetc(fp);
    if(*ch=='\n')
      { hang++;
      /*  printf("第%d行内容: \n",hang); */
       }
 }
/* /////////////////////////////////////////////////////////////////////////// */
/*  再次定义读取下一个字符是为了统计行准确 */
 void GetBChar(FILE *fp,char *ch)
 {
    *ch = fgetc(fp);

      /*  printf("第%d行内容: \n",hang); */

 }
/* //////////////////////////////////////////////////////////////////////// */
 /* 读取第一个不为零的字符 */
void Get_Space(FILE *fp,char *ch)
 {
   do
     {
       GetAChar(fp,ch);

      }
   while(Space(*ch)&&(*ch!= EOF));
 }
/* //////////////////////////////////////////////////////////////////////// */
 /* 返回上个字符的指针,并置ch为空 */
void Return_A(FILE *fp,char *ch)
  {
    fseek(fp,-1,1);
    *ch='';
   }
/* /////////////////////////////////////////////////////////////////////// */
   /* 把读到的字符连到一起 */
void Join(char *string, char *ch)
{
   int i;
   for(i=0;i<80;i++)
    {
      if(*string == NULL)
        {
           *string = *ch;
           break;
         }
      string++;
    }
} 
/* /////////////////////////////////////////////////////////////////////////// */

/* 词法分析程序 */
int cifafenxi(FILE *fp1,FILE *fp2,FILE *fp6,FILE *fp3,FILE *fp5)
{
   FILE *fp4;
   char ch;
   char ch1;
   int code;
   int i,j,k,h;
   char string[100];
   char string1[50] ;
    fprintf(fp2,"输出的格式为:<--$助记符,种别编码,行号,代码-->\n");
   /* Get_Space(fp4,&ch1);
     while(ch1!=EOF)
      { printf("%c",ch1);GetAChar(fp4,&ch1);getch();} */
 while(1)
  {  if((fp4=fopen("guanjz.txt","rt"))==NULL)
       {
          printf("guanjz.txt不能打开~\n");
          getch();
          exit(1);
        }
     Get_Space(fp1,&ch);
      k=0;h=1;
      /* printf("%c",ch);
          getch();*/
     for(i=0;i<100;i++)
         string[i]=NULL;
     if(ch==EOF)
       {
           printf("词法分析结束,保存文件为out.txt,按任意键结束~");
           getch();
           return 0;
        }

     if (Pha(ch))
       {
         while (Pha(ch) ||Num(ch)||xiahuaxian_(ch))
          {
             Join(string,&ch);
             GetAChar(fp1,&ch);
           }
       if(ch==EOF)
          {
              printf("词法分析结束,保存文件为out.txt,按任意键结束~");
              getch();
              return 0;
          }
        Return_A(fp1,&ch);

/* ===============关键字的查询和输出============================ */
    while(h==1)
  { for(j=0;j<50;j++)
     string1[j]=NULL;



  Get_Space(fp4,&ch1);

/* printf("%c",ch1);
    getch();
 fclose(fp4);
        GetAChar(fp4,&ch1);
     printf("%c",ch1);
      getch();*/

     if(ch1==EOF)
    {     if(k==0)
          {  printf("<--$ID,6,%d,%s-->\n",hang,string);
             fprintf(fp2,"<--$ID,6,%d,%s-->\n",hang,string);
             fprintf(fp5,"<--%d,%s-->\n",hang,string);
             k=0;
          }
      h=0;
    }
   while((!Pha(ch1))&&ch1!=EOF)
         {  GetBChar(fp4,&ch1);
           /*  printf("%c",ch1);
            getch();*/
         }

     while (Pha(ch1))
      {
           Join(string1,&ch1);
           GetBChar(fp4,&ch1);

      }
    /* printf("%s ",string);
      printf("%s\n",string1);getch();*/
      if(strcmp(string,string1) == 0)
      {  k=1; h=0;
         printf("<--$%s,",string);
         fprintf(fp2,"<--$%s,",string);
        GetBChar(fp4,&ch1);
        for(j=0;j<50;j++)
        string1[j]=NULL;
        while(!Num(ch1)&&ch1!=EOF)
        {  GetBChar(fp4,&ch1);
        }
        while(Num(ch1))
         { Join(string1,&ch1);
           GetBChar(fp4,&ch1);

         }
         printf("%s,%d,%s-->\n",string1,hang,string);
         fprintf(fp2,"%s,%d,%s-->\n",string1,hang,string);
       }
      /* else
       {
        GetBChar(fp4,&ch1);
        while(!Pha(ch1)&&ch1!=EOF)
         {  GetBChar(fp4,&ch1);
         }
       }
    fclose(fp4) ;*/
          }
 }/* if结束    */
 /* ===========关键字查询输出完成======================== */
        /* printf("%d",code); */
            /* getch(); */
             /* 常量判断 */
            else if (Num(ch))
            {
                while (Num(ch))
                   {
                       Join(string,&ch);
                       GetAChar(fp1,&ch);
                    }
                 if(ch==EOF)
                   {
                       printf("词法分析结束,保存文件为out.txt,按任意键结束~");
                       getch();
                       return 0;
                    }
                Return_A(fp1,&ch);
                code=77;
                printf("<--$INT,%d,%d,%s-->\n",code,hang,string);
                fprintf(fp2,"<--$INT,%d,%d,%s-->\n",code,hang,string);

            }

            else if (ch == '=')
            {   /* “=”号判断 */
                code=51;
                printf("<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
                fprintf(fp2,"<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
                fprintf(fp6,"<--%d,%c-->\n",hang,ch);
             }

            else if (ch == '+')
            {   /* “+“号判断 */
                code=52;
                printf("<--$PLUS,%d,%d,%c-->\n",code,hang,ch);
                fprintf(fp2,"<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
                fprintf(fp6,"<--%d,%c-->\n",hang,ch);
             }

⌨️ 快捷键说明

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