基础入门:提取C++库函数的代码
package edu.kevin.regular;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class SrcAnalyze ...{
private String srcDir;
private HashSet allAPI;
private HashSet inAPI;
private Pattern pt;
public SrcAnalyze(String dir) ...{
srcDir = dir;
allAPI = new HashSet(1000);
inAPI = new HashSet(1000);
//抽取C++的库函数调用
pt = Pattern.compile(\"(\\b+)(\\w+)\\([^\\)]*\\)(\\s*(\\{)|[^\\{])\");
}
public void extract() ...{
Date start = new Date();
long startTime = start.getTime();
extDir(srcDir);
for (Object hs : inAPI) ...{
if (allAPI.contains(hs)) ...{
allAPI.remove(hs);
}
}
Date end = new Date();
long endTime = end.getTime();
//计算程序运行时间
System.out.println(\"Time: \" + (endTime - startTime) + \"ms\");
}
//遍历指定目录(包括子文件夹)
private void extDir(String strPath) ...{
File dir = new File(strPath);
File[] files = dir.listFiles();
if (files == null) [Page]
return;
for (File fl : files) ...{
if (fl.isDirectory()) ...{
extDir(fl.getAbsolutePath());
} else ...{
String strFileName = fl.getAbsolutePath();
if (strFileName.matches(\"^.+\\.([cChH]|(cpp))$\"))
readFile(strFileName);
}
}
}
private void readFile(String filename) ...{
try ...{
BufferedReader in = new BufferedReader(new FileReader(filename));
String s = null;
StringBuffer tmp = new StringBuffer(\"\");
//删除所有的注释(单行的双行的)
while ((s = in.readLine()) != null) ...{
if (!(s.matches(\"^\\s*/\\*.+$\"))) ...{
// get rid of comment like \"//...\"(Single Line) tmp.append(s.replaceAll(\"\"[^\"]*\"\", \"\").replaceAll(
\"//.+$\", \"\")); [Page]
} else ...{
// get rid of comment like \"/*...*/\"(Multi-Lines)
if (!(s.matches(\"^.+\\*/$\"))) ...{
while ((s = in.readLine()) != null) ...{
if (s.matches(\"^.+\\*/$\"))
break;
}
}
}
}
in.close();
//抽取库函数调用
extMethod(tmp);
} catch (IOException e) ...{
System.out.println(e.toString());
}
}
//抽取库函数调用
private void extMethod(StringBuffer src) ...{
int i = 0, j = 0;
String tmp;
// internal API
Matcher m = pt.matcher(src); [Page]
while (m.find()) ...{
tmp = m.group(2);
if (!tmp.equals(\"if\") && !tmp.equals(\"for\") && !tmp.equals(\"while\")
&& !tmp.equals(\"switch\") && !tmp.equals(\"return\")) ...{
allAPI.add(tmp);
if (m.group(4) != null)
inAPI.add(tmp);
}
}
}
public void print() ...{
System.out.println(\"+++++++++++++++++++++++++++++++++++++++\");
Object[] allAPI_List = allAPI.toArray();
Arrays.sort(allAPI_List);
for (Object all : allAPI_List)
System.out.println(all);
System.out.println(\"+++++++++++++++++++++++++++++++++++++++\");
}
public static void main(String[] args) ...{
SrcAnalyze test = new SrcAnalyze(\"D:\\Test\");
test.extract();
test.print();
}
}
- 最新评论
