求一词法分析程序C++版 可以去掉注释/*...... */ 和//的,不胜感激 5

不光有忽略注释,还要可以对样本文件内容进行词法分析。。。... 不光有忽略注释,还要可以对样本文件内容进行词法分析。。。 展开
 我来答
ydliwei1123
2012-03-30 · TA获得超过326个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:214万
展开全部
做一个状态机

下面的状态表示:
0: 正在分析
1:读到第一个/
2:读完第二个/,"//...
3:读到 "/*...
4:读到 "/*...*
5:读到第一个"
6:读到字符串里的转义符 "...\
7:找到注释
0和7是等价的状态,但是可以用7状态做些特别的事情,比如这个时候删除刚找到的注释等。最后的程序如下,输入输出还是用C的文件比较方便:

#include "stdio.h"
#include "string"
char fsm[8][128];
void initfsm()
{
const int line_len=sizeof(char)*128;
memset(fsm[0],0,line_len);
memset(fsm[1],0,line_len);
memset(fsm[2],2,line_len);
memset(fsm[3],3,line_len);
memset(fsm[4],3,line_len);
memset(fsm[5],5,line_len);
memset(fsm[6],5,line_len);
memset(fsm[7],0,line_len);
fsm[0]['/']=1;
fsm[0]['"']=5;
fsm[1]['/']=2;
fsm[1]['*']=3;
fsm[1]['"']=5;
fsm[2]['\n']=7;
fsm[3]['*']=4;
fsm[4]['/']=7;
fsm[4]['*']=4;
fsm[5]['"']=0;
fsm[5]['\\']=6;
fsm[7]['/']=1;
fsm[7]['"']=5;
}
int main()
{
int state=0;
char c;
std::string s;
FILE *fin=fopen("e:\\in.txt","r");
FILE *fout=fopen("e:\\out.txt","w");
initfsm();
while(fscanf(fin,"%c",&c)!=EOF)
{
state=fsm[state][c];
s+=c;
switch(state)
{
case 0:
fprintf(fout,"%s",s.c_str());
s="";
break;
case 7:
s="";
if(c=='\n')
{
fputc(c,fout);
}
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}

参考资料: http://zhidao.baidu.com/question/194332000.html

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式