comment.cpp
上传用户:wlxyanmin
上传日期:2022-01-06
资源大小:1k
文件大小:3k
源码类别:

词法分析

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <stdlib.h>
  6. #define PRO_MAX_LEN 20480    //源程序最大长度
  7. int errorLine=0;
  8. char proBuffer[PRO_MAX_LEN];    //存储程序代码的全局缓冲区
  9. char ch;                            //读出来的当前字符
  10. int point = 0;                        //源程序当前位置指针
  11. //错误
  12. void ProcError(int id)
  13. {
  14.     printf("nError");
  15. }
  16. //获得一个字符
  17. bool GetChar()
  18. {
  19.     if(point < PRO_MAX_LEN && proBuffer[point] != '')
  20.     {//如果当前下标合法且当前字符为结束标记则取字符增游标
  21.         ch = proBuffer[point++];
  22.         if (ch == 'n')
  23.             errorLine ++;
  24.         return true;
  25.     }
  26.     ch = '';
  27.     return false;
  28. //将搜索指示器回调一个字符位置
  29. void Retract()///char *ch
  30.     if(proBuffer[point] == 'n' && errorLine > 0)
  31.         errorLine --;
  32.     point --;
  33. }
  34. //预处理 将缓冲区内的源代码去掉注释和无效空格
  35. void pretreatment()
  36. {int lines=0;
  37.     char tmp[PRO_MAX_LEN];    //先将处理结果保存到临时空间
  38.     int tmpp = 0;             //这个临时空间的末尾指针
  39.     bool flg;
  40.     char tmpc;
  41.     //去掉注释先
  42.     //注释有两种 一种是// 另一种是/**/
  43.     point = 0;
  44.     do
  45.     {
  46.         flg = GetChar();
  47.         if(ch == '/')
  48.         {
  49.             flg = GetChar();
  50.             switch(ch)
  51.             {
  52.             case '/':
  53.                 do
  54.                 {
  55.                     flg = GetChar();                    
  56.                 }while(!(ch == 'n' || flg == false));//注释一直到行尾或文件结束
  57.                 if(ch == 'n')
  58.                     Retract();    //归还换行
  59.                 break;
  60.             case '*':
  61.                 do
  62.                 {
  63.                     flg = GetChar();
  64.                     tmpc = ch;
  65.                     //为了保证出错处理程序能正确定位出错位置 保留注释中的换行
  66.                     if(tmpc == 'n')
  67.                         tmp[tmpp++] = tmpc;
  68.                     flg = GetChar();
  69.                     Retract();    //归还一个字符
  70.                 }while(!(tmpc=='*'&&ch=='/'));
  71.                 flg = GetChar();
  72.                 if (!flg)
  73.                 {
  74.                     ProcError(5);
  75.                 }
  76.                 break;
  77.             default:             //不是任何一种注释
  78.                 Retract();
  79.                 Retract();
  80.                 GetChar();
  81.                 tmp[tmpp++] = ch;
  82.                 flg = GetChar();
  83.                 tmp[tmpp++] = ch;
  84.             }
  85.         }
  86.         else
  87.         {
  88.             tmp[tmpp++] = ch;
  89.         }
  90.     }while(flg);
  91.     tmp[tmpp] = '';
  92.     strcpy(proBuffer,tmp);
  93. }
  94. void main()
  95. {
  96.     FILE *fin;
  97.     int i;
  98.     char c;
  99.     printf("源代码读入n");
  100.     if ((fin=fopen("Test.txt","r")) == NULL)
  101.     {
  102.         printf("Cannot open infilen");
  103.     }
  104.     i = 0;
  105.     while((c = fgetc(fin)) != EOF)
  106.     {
  107.         if(i >= PRO_MAX_LEN-1)
  108.         {
  109.             printf("n程序代码太长,无法处理a");
  110.         
  111.         }
  112.         proBuffer[i++] = c;
  113.     }
  114.     fclose(fin);    //关闭文件
  115.     proBuffer[i++] = '';
  116.     printf("n***************************n源代码读入成功,源代码如下:n%s",proBuffer);
  117.     printf("n按任意键继续n");    
  118.     getch();
  119.     printf("n预处理n");//预处理
  120.     pretreatment();
  121.     printf("n***************************n预处理成功,去掉注释后的源代码为:n%s",proBuffer);
  122. }