编译器预处理实现
来源:互联网 发布:可以拍电影的软件 编辑:程序博客网 时间:2024/06/08 08:04
我们写代码一般都会写一些注释,为了让人更好的理解代码,但是对于编译器来说,这些注释都需要去除,为了实现预处理,就是去除注释、换行、回车等,我用DFA(确定有限自动机)来实现。
#include <iostream>#include <fstream>using namespace std;#define R 10#define C 8//DFAint DFA[R][C]= \{ /* / * \ ' " \n other *//*0*/{0, 1, 0, 0, 8, 6, 0, 0},/*1*/{0, 2, 3, 0, 8, 0, 0, 0},/*2*/{0, 2, 2, 4, 2, 2, 0, 2},/*3*/{0, 3, 5, 3, 3, 3, 3, 3},/*4*/{0, 2, 2, 4, 2, 2, 4, 2},/*5*/{0, 0, 5, 3, 3, 3, 3, 3},/*6*/{0, 6, 6, 7, 6, 0, 6, 6},/*7*/{0, 6, 6, 7, 6, 6, 6, 6},/*8*/{0, 8, 8, 9, 0, 8, 8, 8},/*9*/{0, 8, 8, 8, 8, 8, 8, 8}};//字符转码int code(char ch){int chars = 7;switch(ch){case '/': chars=1;break;case '*': chars=2;break;case '\\':chars=3;break;case '\'':chars=4;break;case '\"':chars=5;break;case '\n':chars=6;break;default:chars=7;break;}return chars;}//判断是空格、tab、回车、换行等int Judge(char curch){if((curch == ' '||curch == '\t' || curch=='\r' || curch == '\n' || curch == '\\')) return 1;else return 0;}void Pretreat(const char*src, const char *des){if(src == NULL || des == NULL) return;int i = 0;int j = 0; //打开文件ifstream infile(src);if(infile.fail()){cout<<"open "<<src<< " fail!"<<endl;return;}ofstream outfile(des, ios::out);if(outfile.fail()){cout<<"open or create "<<des<< " fail!"<<endl;return;} //获取文件大小infile.seekg(0,ios::end); unsigned int size=static_cast<unsigned int>(infile.tellg()); infile.seekg(0,ios::beg); char *rbuffer = new char [sizeof(char)*size];char *wbuffer = new char [sizeof(char)*size];memset(rbuffer, '\0', size);memset(wbuffer, '\0', size);infile.get(rbuffer, size, infile.eof()); //当前字符char curch=' '; //前一个字符char prech = ' '; //前一个状态int prestate = DFA[0][0]; //当前状态int curstate = DFA[0][0];int space = 0;while((curch = rbuffer[i])!='\0'){curstate = DFA[curstate][code(curch)];switch (curstate){case 0: //这里需要考虑除号‘/’,比如 12/3,这当然不能去除if(prestate == 1 && code(prech) == 1){wbuffer[j++] = prech;}else if(code(curch) == 1){break;}if(Judge(curch)&& space == 0){//if(curch == '\n')//{//wbuffer[j++] ='\n';//}//else//{ wbuffer[j++] =' '; //}space = 1;break;}else if(Judge(curch)&& space == 1){break;}else{space = 0;}case 6:case 7:case 8:case 9:wbuffer[j++] = curch;break;}prestate = curstate;prech = curch;i++;}outfile<<wbuffer;delete [] rbuffer;delete [] wbuffer;infile.close();outfile.close();}int main(){char *src = "D:\\project\\deal.cpp";char *des="D:\\result.cpp";Pretreat(src, des);return 0;}
0 0
- 编译器预处理实现
- 编译器预处理
- C编译器预处理符号
- 编译器和预处理器
- 编译器的一些预处理机制
- 编译器预处理#ifndef 条件编译
- 初始GCC编译器之预处理
- 预处理器、编译器、汇编、链接
- Scheme 编译器--预处理器制作 (一) 去掉注释 及 实现单宏
- 用java开发编译器之:代码实现Thompson构造1,输入文本预处理
- 编译器比预处理器更有效!
- 尽量用编译器而不用预处理
- 输出编译器预处理器的中间文件
- 预处理器,编译器,汇编器,连接器
- LCC编译器的源程序分析(2)LCC编译器的预处理
- 预处理实现条件编译
- 编译器之预处理程序 (去除注释符)
- 预处理器-编译器-汇编器-链接器(转)
- Eclipse SVN冲突详细解决方案
- string 与char* 、char[]、const char*之间的转换
- 算法学习———KM算法
- 【技术贴】ArcGIS Runtime for Xamarin 洪荒之力-查找路径
- C语言基础学习学习前的准备-2
- 编译器预处理实现
- String中"=="和equal()的区别
- 百度编辑器 绑定指定的容器
- Stacking Notifications(层叠多 个Notification)
- Android学习笔记之BroadcastReceiver
- 进军Docker 1.12,将代理与Swarm完美整合
- NDK: multiple definition of 'typeinfo for XXX' "vtable for xxx" 错误
- 不同浏览器扫描二维码后跳转到不同的网址
- zzulioj -- 1908 小火山的围棋梦想