下面的狀態表示:
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;}