求一词法分析程序C++版 可以去掉注释/*...... */ 和//的,不胜感激 5
展开全部
做一个状态机
下面的状态表示:
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;
}
下面的状态表示:
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询