问题需求:将一个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: