如何使用ANTLR从java src代码生成AST?
有什么帮助吗?
答案 0 :(得分:13)
好的,这是以下步骤:
Java.g
和JavaTreeParser.g
个文件
运行以下命令:
java -jar antlrTool Java.g
java -jar antlrTool JavaTreeParser.g
将生成5个文件:
使用此java代码生成抽象语法树并打印它:
String input = "public class HelloWord {"+
"public void print(String r){" +
"for(int i = 0;true;i+=2)" +
"System.out.println(r);" +
"}" +
"}";
CharStream cs = new ANTLRStringStream(input);
JavaLexer jl = new JavaLexer(cs);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(jl);
JavaParser jp = new JavaParser(tokens);
RuleReturnScope result = jp.compilationUnit();
CommonTree t = (CommonTree) result.getTree();
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
nodes.setTokenStream(tokens);
JavaTreeParser walker = new JavaTreeParser(nodes);
System.out.println("\nWalk tree:\n");
printTree(t,0);
System.out.println(tokens.toString());
}
public static void printTree(CommonTree t, int indent) {
if ( t != null ) {
StringBuffer sb = new StringBuffer(indent);
for ( int i = 0; i < indent; i++ )
sb = sb.append(" ");
for ( int i = 0; i < t.getChildCount(); i++ ) {
System.out.println(sb.toString() + t.getChild(i).toString());
printTree((CommonTree)t.getChild(i), indent+1);
}
}
}
答案 1 :(得分:2)
使用antlr4生成java src AST的setps是:
现在使用以下命令生成Java8Lexer和Java8Parser:
antlr4 -visitor Java8.g4
这会生成多个文件,例如Java8BaseListener.java
Java8BaseVisitor.java
Java8Lexer.java
Java8Lexer.tokens
Java8Listener.java
Java8Parser.java
Java8.tokens
{{ 1}}
使用此代码生成AST:
Java8Visitor.java
完成编码后,您可以使用gradle构建项目,也可以在项目目录中下载antlr-4.7.1-complete.jar并开始编译。
如果你想要一个DOT文件中的输出,以便你可以看到AST那么你可以参考this QnA帖子或直接引用我使用gradle构建的repository该项目。
希望这会有所帮助。 :)