2012-02-05 7 views
6

Come posso generare un AST dal codice java src usando ANTLR?
qualche aiuto?Generazione di un abstract syntax tree per il codice sorgente java usando ANTLR

+1

Troppo largo. Inizia con il tutorial ANTLR o cercando le grammatiche esistenti. – millimoose

+0

Ottieni una grammatica Java.Esegui il codice sorgente Java attraverso le classi generate da ANTLR. Potrebbe essere più facile usare la roba di Eclipse, comunque. –

+0

puoi postare qualsiasi link o tutorial utile? Grazie – Aboelnour

risposta

1

I setps per generare java src AST utilizzando antlr4 sono:

  1. Installare antlr4 puoi usare il link this per farlo.
  2. Dopo l'installazione, scaricare JAVA grammar from here.
  3. Ora generare Java8Lexer e Java8Parser utilizzando il comando:

    antlr4 -visitor Java8.g4

  4. Questo genererà diversi file, come Java8BaseListener.javaJava8BaseVisitor.javaJava8Lexer.javaJava8Lexer.tokensJava8Listener.javaJava8Parser.javaJava8.tokensJava8Visitor.java

Utilizzare questo codice per generare 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)); 
      } 
     } 
    } 
} 

Dopo aver finito di codifica è possibile utilizzare Gradle per costruire il vostro progetto o è possibile scaricare antlr-4.7.1-complete.jar nella directory del progetto e avviare la compilazione.

Se si desidera un l'output in un file DOT in modo che u può visualizzare l'AST allora si può fare riferimento a this QnA posta o fare riferimento direttamente a questo repository in cui ho usato Gradle per generare il progetto.

Spero che questo aiuti. :)

12

OK, qui sono i passi:

  1. vai alla ANTLR Site e scaricare l'ultima versione ora è 4.7
  2. Scarica i ei file Java.gJavaTreeParser.g da here.
  3. Eseguire i seguenti comandi:

    java -jar antlrTool Java.g 
    java -jar antlrTool JavaTreeParser.g 
    
  4. 5 file verranno generati:

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

uso di questo codice java per generare la Syntax Tree astratta e stamparlo:

 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

Grazie @Aboelnour. Ma la pagina su cui stai reindirizzando non esiste più. qualsiasi aiuto? –

+0

Un'altra domanda, se JavaTreeParser.java non è tra i file generati, da dove proviene? –

+1

@MakanTayebi Penso che questo possa aiutare: https://github.com/antlr/grammars-v4 – ConductedClever

Problemi correlati