我需要在我最近的工作中解决一个类似的问题。我试过很多工具,包括Eclipse JDT ASTParser、pythonjavalang和PPA。我想分享我的经验。综上所述,它们都可以在一定程度上解析代码片段,但是当代码片段太模糊时,偶尔都会解析失败。
Eclipse JDT ASTParser 是最强大和最广泛使用的工具。这是解析方法调用节点的代码sn-p。
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 库。这是解析方法调用节点的代码sn-p。
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'异常。您可以阅读source code 来确定您应该使用哪个功能。
Partial Program Analysis for Java (PPA) 是一个静态分析框架,可将不完整的 Java 程序的源代码转换为类型化的抽象语法树。正如@Oak 所说,这个工具来自学院。
PPA 作为一组 Eclipse 插件提供,这意味着它需要与 Eclipse 一起运行。它提供了headless 的运行方式,无需显示 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;
}
});