2012-02-05 79 views
6

Làm thế nào tôi có thể tạo một AST từ mã java src bằng cách sử dụng ANTLR?
bất kỳ trợ giúp nào?Tạo một cây cú pháp trừu tượng cho mã nguồn java bằng cách sử dụng ANTLR

+1

Cách quá rộng. Bắt đầu với hướng dẫn ANTLR hoặc tìm kiếm các ngữ pháp hiện có. – millimoose

+0

Nhận ngữ pháp Java.Chạy nguồn Java thông qua các lớp do ANTLR tạo ra. Có thể dễ dàng hơn để sử dụng các công cụ Eclipse, mặc dù. –

+0

bạn có thể vui lòng đăng bất kỳ liên kết hoặc hướng dẫn hữu ích nào không? Cảm ơn – Aboelnour

Trả lời

1

Các setps để tạo java src AST sử dụng antlr4 là:

  1. Install antlr4 bạn có thể sử dụng liên kết this để làm điều đó.
  2. Sau khi cài đặt tải xuống JAVA grammar from here.
  3. Bây giờ tạo Java8Lexer và Java8Parser sử dụng lệnh:

    antlr4 -visitor Java8.g4

  4. này sẽ tạo ra một số tác phẩm như Java8BaseListener.javaJava8BaseVisitor.javaJava8Lexer.javaJava8Lexer.tokensJava8Listener.javaJava8Parser.javaJava8.tokensJava8Visitor.java

Sử dụng mã này để tạo ra 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)); 
      } 
     } 
    } 
} 

Sau khi mã hóa xong, bạn có thể dùng gradle để xây dựng dự án hoặc tải antlr-4.7.1-complete.jar vào thư mục dự án và bắt đầu biên dịch.

Nếu bạn muốn đầu ra trong tệp DOT để bạn có thể trực quan hóa AST, bạn có thể tham khảo this Bài đăng QnA hoặc trực tiếp tham chiếu đến repository trong đó tôi đã sử dụng gradle để xây dựng dự án.

Hy vọng điều này sẽ hữu ích. :)

12

OK, sau đây là các bước:

  1. đi đến ANTLR Site và tải phiên bản mới nhất hiện nay đó là 4,7
  2. Tải Java.gJavaTreeParser.g tập tin từ here.
  3. Chạy các lệnh sau:

    java -jar antlrTool Java.g 
    java -jar antlrTool JavaTreeParser.g 
    
  4. 5 file sẽ được tạo:

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

sử dụng mã java này để tạo cú pháp trừu tượng Tree và in nó:

 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

Cảm ơn @Aboelnour. Nhưng trang bạn đang cố gắng không tồn tại nữa. bất kỳ giúp đỡ? –

+0

Một câu hỏi khác, nếu JavaTreeParser.java không nằm trong số các tệp được tạo, nó xuất phát từ đâu? –

+1

@MakanTayebi Tôi nghĩ rằng điều này sẽ giúp: https://github.com/antlr/grammars-v4 – ConductedClever

Các vấn đề liên quan