去除java中的注释小工具开发心得

来源:互联网 发布:centos7修改ssh端口 编辑:程序博客网 时间:2024/06/06 10:55

问题需求:将一个java文件中的注释替换为空字符,即消除java文件中的注释。 输入:一个目标文件绝对路径和输出文件的绝对路径

看似简单,实则需要花脑筋的一件事,最后决定用有限状态机来解决这个问题,参考了Tristan的表驱动方法,很巧妙,链接:http://my.oschina.net/Tristan/blog/34118


状态机如下表:
0:普通字符代码
1:出现一个/
2://注释态
3:/*注释态
4:/*...*准备结束注释
5:"双引号状态
6:有效转义字符态(双引号后遇到\)
7:'单引号状态
8:有效转义字符态2(单引号后遇到\)
9:注释结束状态,该状态时打印处理后的注释内容,并清空缓冲区
状态:
/
*
"
\
'
回车
其他字符
0
1
0
5
0
7
0
0
1
2
3
5
0
6
0
0
2
2
2
2
2
2
9
2
3
3
4
3
3
3
3
3
4
9
4
3
3
3
3
3
5
5
5
0
6
5
5
5
6
5
5
5
5
5
5
5
7
7
7
7
8
0
7
7
8
7
7
7
7
7
7
7
9
1
0
5
0
7
0
0

代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;


public class RemoveAnnotation2 {

 static String inputFile = "E:\\test\\test1.java";
 static String outputFile = "E:\\test\\test1_rep1.java ";

 int[][] fsm = new int[10][128];

 int state = 0;

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  if (args.length >= 2) {
   inputFile = args[0];
   outputFile = args[1];
  }
  RemoveAnnotation2 me = new RemoveAnnotation2();
  me.initFSM();

  File input = new File(inputFile);
  File output = new File(outputFile);

  try {
   me.handleFile(input, output);
  } catch (Exception ex) {
   ex.printStackTrace();
  }

 }

 public void initFSM() {
  //初始化状态机
  for (int i = 0; i < 128; i++) {
   fsm[0][i] = 0;
   fsm[1][i] = 0;
   fsm[2][i] = 2;
   fsm[3][i] = 3;
   fsm[4][i] = 3;
   fsm[5][i] = 5;
   fsm[6][i] = 5;
   fsm[7][i] = 7;
   fsm[8][i] = 7;
   fsm[9][i] = 0;
  }
  fsm[0]['/'] = 1;
  fsm[0]['"'] = 5;
  fsm[0]['\''] = 7;
  fsm[1]['/'] = 2;
  fsm[1]['*'] = 3;
  fsm[1]['"'] = 5;
  fsm[2]['\n'] = 9;
  fsm[3]['*'] = 4;
  fsm[4]['/'] = 9;
  fsm[4]['*'] = 4;
  fsm[5]['"'] = 0;
  fsm[5]['\\'] = 6;
  fsm[7]['\\'] = 8;
  fsm[7]['\''] = 0;
  fsm[9]['/'] = 1;
  fsm[9]['"'] = 5;
  fsm[9]['\''] = 7;

 }

 public int parseChar(char a) {
  int result = a;
  return result;
 }

 public char parseInt(int a) {
  char result = (char) a;
  return result;
 }

 public void handleFile(File in, File out) throws Exception {

  int c;
  String temp = "";
  char[] cbuf = null;

  BufferedReader br = new BufferedReader(new FileReader(in));
  BufferedWriter bw = new BufferedWriter(new FileWriter(out));

  while ((c = br.read()) != -1) {

   state = fsm[state][c];
   temp = temp + parseInt(c);
   switch (state) {
   case 0:
    bw.write(temp);
    temp = "";
    break;
   case 9:
    //注释结束态,将除了换行的字符全部替换为“ ”输出。
    cbuf = temp.toCharArray();
    for (int i = 0; i < cbuf.length; i++)
     if (cbuf[i] != '\n')
      cbuf[i] = ' ';

    bw.write(cbuf);
    temp = "";
    cbuf = null;
    break;
   }
  }

  br.close();
  bw.close();

 }

}

Reference:
原作者:http://www.programfan.com/blog/article.asp?id=34091

0 0