正文

用状态机实现对代码中注释的清除2008-07-03 14:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/zhaoyg/36443.html

分享到:

之前写了一个同样功能的一段程序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;
}

阅读(3266) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册