使用ANTLR为java源代码生成抽象语法树

时间:2012-02-05 20:14:14

标签: java antlr abstract-syntax-tree

如何使用ANTLR从java src代码生成AST?
有什么帮助吗?

2 个答案:

答案 0 :(得分:13)

好的,这是以下步骤:

  1. 转到ANTLR site并下载最新版本
  2. here
  3. 下载Java.gJavaTreeParser.g个文件
  4. 运行以下命令:

    java -jar antlrTool Java.g
    java -jar antlrTool JavaTreeParser.g
    
  5. 将生成5个文件:

    1. Java.tokens
    2. JavaLexer.java
    3. JavaParser.java
    4. JavaTreeParser.g
    5. JavaTreeParser.tokens
  6. 使用此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是:

  1. 安装antlr4,您可以使用this链接来执行此操作。
  2. 安装后,请下载JAVA grammar from here
  3. 现在使用以下命令生成Java8Lexer和Java8Parser:

    antlr4 -visitor Java8.g4

  4. 这会生成多个文件,例如Java8BaseListener.java Java8BaseVisitor.java Java8Lexer.java Java8Lexer.tokens Java8Listener.java Java8Parser.java Java8.tokens {{ 1}}

  5. 使用此代码生成AST:

    Java8Visitor.java

    完成编码后,您可以使用gradle构建项目,也可以在项目目录中下载antlr-4.7.1-complete.jar并开始编译。

    如果你想要一个DOT文件中的输出,以便你可以看到AST那么你可以参考this QnA帖子或直接引用我使用gradle构建的repository该项目。

    希望这会有所帮助。 :)