去除java中的注释小工具开发心得
2014-12-22 19:17
141 查看
问题需求:将一个java文件中的注释替换为空字符,即消除java文件中的注释。 输入:一个目标文件绝对路径和输出文件的绝对路径
看似简单,实则需要花脑筋的一件事,最后决定用有限状态机来解决这个问题,参考了Tristan的表驱动方法,很巧妙,链接:http://my.oschina.net/Tristan/blog/34118
状态机如下表:
0:普通字符代码
1:出现一个/
2://注释态
3:/*注释态
4:/*...*准备结束注释
5:"双引号状态
6:有效转义字符态(双引号后遇到\)
7:'单引号状态
8:有效转义字符态2(单引号后遇到\)
9:注释结束状态,该状态时打印处理后的注释内容,并清空缓冲区
代码如下:
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
看似简单,实则需要花脑筋的一件事,最后决定用有限状态机来解决这个问题,参考了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
相关文章推荐
- 关于一些Java开发工具的使用心得(不断更新)
- JavaSE——Java开发工具Eclipse:注释不被格式化设置
- J2EE综合--JAVA开发工具安装配置心得
- Java之开发工具(1) - Eclipse 如何设置注释的模板
- JAVA开发工具安装配置心得
- java开发工具一个很好的注释模板
- java用工具反编译后出现的垃圾注释去除方案
- 关于使用Java开发工具的一些心得
- 原创:关于一些Java开发工具的使用心得(不断更新)
- [JAVA]十四种Java开发工具点评
- JAVA开放源码项目与工具在企业应用开发中的运用(ZZ)
- 扩展Eclipse的Java开发工具(四)
- Java开发工具之我见(补)
- 【Java开发工具】十四种Java开发工具点评(转)
- java初学者常用开发工具介绍
- java代码框架生成工具 开发记录2005-03-02
- SMTH Java FAQ (1) 开发工具与开发环境(菜鸟必看)
- 扩展Eclipse的Java开发工具(二)
- Eclipse-一个我熟悉一点的java开发工具
- 群雄逐鹿 十四种Java开发工具点评