我需要在我最近的工作中解决类似的问题。我尝试了很多工具,包括Eclipse JDT ASTParser、 python javalang和PPA。我想分享我的经验。综上所述,它们都可以在一定程度上解析代码片段,但是当代码片段太模糊时,偶尔都会解析失败。
Eclipse JDT ASTParser 是最强大且使用最广泛的工具。这是解析方法调用节点的代码片段。
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setResolveBindings(true);
parser.setKind(ASTParser.K_STATEMENTS);
parser.setBindingsRecovery(true);
Map options = JavaCore.getOptions();
parser.setCompilerOptions(options);
parser.setUnitName("test");
String src = "System.out.println(\"test\");";
String[] sources = { };
String[] classpath = {"C:/Users/chenzhi/AppData/Local/Programs/Java/jdk1.8.0_131"};
parser.setEnvironment(classpath, sources, new String[] { }, true);
parser.setSource(src.toCharArray());
final Block block = (Block) parser.createAST(null);
block.accept(new ASTVisitor() {
public boolean visit(MethodInvocation node) {
System.out.println(node);
return false;
}
});
您应该注意parser.setKind(ASTParser.K_STATEMENTS)
,这是设置要从源解析的构造类型。ASTParser 定义了四种(K_COMPILATION_UNIT、K_CLASS_BODY_DECLARATIONS、K_EXPRESSION、K_STATEMENTS),你可以看这个javadoc来了解它们之间的区别。
javalang 是一个简单的python 库。这是解析方法调用节点的代码片段。
src = 'System.out.println("test");'
tokens = javalang.tokenizer.tokenize(code2)
parser = javalang.parser.Parser(tokens)
try:
ast = parser.parse_expression()
if type(ast) is javalang.tree.MethodInvocation:
print(ast)
except javalang.parser.JavaSyntaxError as err:
print("wrong syntax", err)
注意ast = parser.parse_expression()
,就像 Eclipse JDT ASTParser 中的 parser.setKind() 函数一样,你应该设置正确的解析函数,否则你会得到 'javalang.parser.JavaSyntaxError' 异常。您可以阅读源代码以确定您应该使用哪个功能。
Java 的部分程序分析 (PPA) 是一个静态分析框架,它将不完整的 Java 程序的源代码转换为类型化的抽象语法树。正如@Oak 所说,这个工具来自学院。
PPA 作为一组 Eclipse 插件提供,这意味着它需要与 Eclipse 一起运行。它提供了一种无需显示 Eclipse GUI 或不需要任何用户输入的无头运行方式,但它太重了。
String src = "System.out.println(\"test\");";
ASTNode node = PPAUtil.getSnippet(src, new PPAOptions(), false);
// Walk through the compilation unit.
node.accept(new ASTVisitor() {
public boolean visit(MethodInvocation node) {
System.out.println(node);
return false;
}
});