comment.cpp
资源名称:comment.rar [点击查看]
上传用户:wlxyanmin
上传日期:2022-01-06
资源大小:1k
文件大小:3k
源码类别:
词法分析
开发平台:
Visual C++
- #include <stdio.h>
- #include <ctype.h>
- #include <string.h>
- #include <conio.h>
- #include <stdlib.h>
- #define PRO_MAX_LEN 20480 //源程序最大长度
- int errorLine=0;
- char proBuffer[PRO_MAX_LEN]; //存储程序代码的全局缓冲区
- char ch; //读出来的当前字符
- int point = 0; //源程序当前位置指针
- //错误
- void ProcError(int id)
- {
- printf("nError");
- }
- //获得一个字符
- bool GetChar()
- {
- if(point < PRO_MAX_LEN && proBuffer[point] != ' ')
- {//如果当前下标合法且当前字符为结束标记则取字符增游标
- ch = proBuffer[point++];
- if (ch == 'n')
- errorLine ++;
- return true;
- }
- ch = ' ';
- return false;
- }
- //将搜索指示器回调一个字符位置
- void Retract()///char *ch
- {
- if(proBuffer[point] == 'n' && errorLine > 0)
- errorLine --;
- point --;
- }
- //预处理 将缓冲区内的源代码去掉注释和无效空格
- void pretreatment()
- {int lines=0;
- char tmp[PRO_MAX_LEN]; //先将处理结果保存到临时空间
- int tmpp = 0; //这个临时空间的末尾指针
- bool flg;
- char tmpc;
- //去掉注释先
- //注释有两种 一种是// 另一种是/**/
- point = 0;
- do
- {
- flg = GetChar();
- if(ch == '/')
- {
- flg = GetChar();
- switch(ch)
- {
- case '/':
- do
- {
- flg = GetChar();
- }while(!(ch == 'n' || flg == false));//注释一直到行尾或文件结束
- if(ch == 'n')
- Retract(); //归还换行
- break;
- case '*':
- do
- {
- flg = GetChar();
- tmpc = ch;
- //为了保证出错处理程序能正确定位出错位置 保留注释中的换行
- if(tmpc == 'n')
- tmp[tmpp++] = tmpc;
- flg = GetChar();
- Retract(); //归还一个字符
- }while(!(tmpc=='*'&&ch=='/'));
- flg = GetChar();
- if (!flg)
- {
- ProcError(5);
- }
- break;
- default: //不是任何一种注释
- Retract();
- Retract();
- GetChar();
- tmp[tmpp++] = ch;
- flg = GetChar();
- tmp[tmpp++] = ch;
- }
- }
- else
- {
- tmp[tmpp++] = ch;
- }
- }while(flg);
- tmp[tmpp] = ' ';
- strcpy(proBuffer,tmp);
- }
- void main()
- {
- FILE *fin;
- int i;
- char c;
- printf("源代码读入n");
- if ((fin=fopen("Test.txt","r")) == NULL)
- {
- printf("Cannot open infilen");
- }
- i = 0;
- while((c = fgetc(fin)) != EOF)
- {
- if(i >= PRO_MAX_LEN-1)
- {
- printf("n程序代码太长,无法处理a");
- }
- proBuffer[i++] = c;
- }
- fclose(fin); //关闭文件
- proBuffer[i++] = ' ';
- printf("n***************************n源代码读入成功,源代码如下:n%s",proBuffer);
- printf("n按任意键继续n");
- getch();
- printf("n预处理n");//预处理
- pretreatment();
- printf("n***************************n预处理成功,去掉注释后的源代码为:n%s",proBuffer);
- }