之前写了一个同样功能的一段程序http://blog.programfan.com/article.asp?id=34327
这次模仿别人的思路,我自己又重新写了一个用状态机实现的。相比之前我写的那个,这次的代码明显短了很多。
/*
用状态机实现对代码中注释的清除.
Visual C++ 2005 编译
08.6.26
zhaoyg
*/
#include <stdio.h>
#include <string.h>
#define SCREEN
void initialize_fsm(char fsm[7][256]);
int main()
{
int ch , temp = 0 ;
int state = 0;
char fsm[7][256];
FILE *pfin ;
pfin = fopen("sweep-comments.txt","r");
#ifdef SCREEN
#define OUT stdout
#else
FILE *pfout;
pfout = fopen("result.txt","w");
#define OUT pfout
#endif
initialize_fsm(fsm);
#pragma region FSM ///尝试#pragma region功能. Visual C++ 2005
while ((ch = fgetc(pfin)) !=EOF)
{
state = fsm[state][ch];
if ( state != 2 && ch !='*' && temp == '/')
fputc(temp,OUT);
temp = ch;
switch(state)
{
/*0,5,6执行同一个动作*/
case 5:
case 6:
case 0:
fputc(ch,OUT);
break;
case 7:
state = 0;
break;
}
if(state != 1)
temp=0;
}
#pragma endregion
}
void initialize_fsm(char fsm[7][256])
{
int lenth = sizeof(char)*256;
memset(fsm[0],0,lenth);
memset(fsm[1],0,lenth);
memset(fsm[2],2,lenth);
memset(fsm[3],3,lenth);
memset(fsm[4],3,lenth);
memset(fsm[5],5,lenth);
memset(fsm[6],5,lenth);
fsm[0]['"'] = 5;
fsm[0]['/'] = 1;
fsm[1]['/'] = 2;
fsm[1]['*'] = 3;
fsm[2]['\n'] = 0;
fsm[3]['*'] = 4;
fsm[4]['/'] = 7;
fsm[5]['\\'] = 6;
fsm[5]['"'] = 0;
}
评论