2012-02-05 80 views
6

如何从java src代码生成AST使用ANTLR?
有帮助吗?使用ANTLR为java源代码生成抽象语法树

+1

方式太宽泛。从ANTLR教程开始,或寻找现有的语法。 – millimoose 2012-02-05 20:17:13

+0

获取Java语法。通过ANTLR生成的类运行Java源代码。不过,可能会更容易使用Eclipse的东西。 – 2012-02-05 20:21:51

+0

你可以请发布任何有用的链接或教程?谢谢 – Aboelnour 2012-02-05 23:03:49

回答

1

的setps使用antlr4生成Java SRC AST是:

  1. 安装antlr4你可以使用this链接来做到这一点。安装后下载JAVA grammar from here
  2. 现在使用命令生成Java8Lexer和Java8Parser:

    antlr4 -visitor Java8.g4

  3. 这将生成多个文件,如Java8BaseListener.javaJava8BaseVisitor.javaJava8Lexer.javaJava8Lexer.tokensJava8Listener.javaJava8Parser.javaJava8.tokensJava8Visitor.java

使用此代码生成AST:

import java.io.File; 
import java.io.IOException; 

import java.nio.charset.Charset; 
import java.nio.file.Files; 

import org.antlr.v4.runtime.ANTLRInputStream; 
import org.antlr.v4.runtime.CommonTokenStream; 
import org.antlr.v4.runtime.ParserRuleContext; 
import org.antlr.v4.runtime.RuleContext; 
import org.antlr.v4.runtime.tree.ParseTree; 

public class ASTGenerator { 

    public static String readFile() throws IOException { 
     File file = new File("path/to/the/test/file.java"); 
     byte[] encoded = Files.readAllBytes(file.toPath()); 
     return new String(encoded, Charset.forName("UTF-8")); 
    } 

    public static void main(String args[]) throws IOException { 
     String inputString = readFile(); 
     ANTLRInputStream input = new ANTLRInputStream(inputString); 
     Java8Lexer lexer = new Java8Lexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     Java8Parser parser = new Java8Parser(tokens); 
     ParserRuleContext ctx = parser.classDeclaration(); 

     printAST(ctx, false, 0); 
    } 

    private static void printAST(RuleContext ctx, boolean verbose, int indentation) { 
     boolean toBeIgnored = !verbose && ctx.getChildCount() == 1 && ctx.getChild(0) instanceof ParserRuleContext; 

     if (!toBeIgnored) { 
      String ruleName = Java8Parser.ruleNames[ctx.getRuleIndex()]; 
      for (int i = 0; i < indentation; i++) { 
       System.out.print(" "); 
      } 
      System.out.println(ruleName + " -> " + ctx.getText()); 
     } 
     for (int i = 0; i < ctx.getChildCount(); i++) { 
      ParseTree element = ctx.getChild(i); 
      if (element instanceof RuleContext) { 
       printAST((RuleContext) element, verbose, indentation + (toBeIgnored ? 0 : 1)); 
      } 
     } 
    } 
} 

你做的编码就可以使用gradle这个来构建你的项目,也可以在你的项目目录下载antlr-4.7.1-complete.jar并启动编译之后。

如果你想在一个DOT文件输出,使u能可视化的AST,那么你可以参考this QNA邮寄或直接引用这个repository在我所使用gradle这个来构建项目。

希望这会有所帮助。 :)

12

OK,这里的步骤:

  1. ANTLR Site现在下载最新版本是4.7
  2. here下载Java.gJavaTreeParser.g文件。
  3. 执行如下命令:

    java -jar antlrTool Java.g 
    java -jar antlrTool JavaTreeParser.g 
    
  4. 5的文件将被生成:

    1. Java.tokens
    2. JavaLexer.java
    3. JavaParser.java
    4. JavaTreeParser.g
    5. JavaTreeParser.tokens

使用这个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

谢谢@Aboelnour。但是,你正在接受的页面不再存在。任何帮助? – 2014-08-22 06:23:15

+0

另一个问题,如果JavaTreeParser.java不在生成的文件中,它来自哪里? – 2014-08-22 06:26:30

+1

@MakanTayebi我认为这将有所帮助:https://github.com/antlr/grammars-v4 – ConductedClever 2017-08-07 20:23:08