闲来无事,写了一个提取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)
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(
"//.+$", ""));
} 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);
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();
}
}
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)
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(
"//.+$", ""));
} 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);
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();
}
}