2012-02-05 46 views
6

¿Cómo puedo generar un código AST desde java src usando ANTLR?
¿Alguna ayuda?Generación de un árbol de sintaxis abstracto para el código fuente de java con ANTLR

+1

Demasiado ancho. Comience con el tutorial de ANTLR o busque gramáticas existentes. – millimoose

+0

Obtenga una gramática de Java.Ejecute el código fuente de Java a través de las clases generadas por ANTLR. Sin embargo, podría ser más fácil usar las cosas de Eclipse. –

+0

¿puede por favor publicar enlaces o tutoriales útiles? Gracias – Aboelnour

Respuesta

1

Los setps para generar java src AST usando antlr4 son:

  1. Instalar antlr4 puede usar el enlace this para hacer eso.
  2. Después de la instalación, descargue JAVA grammar from here.
  3. Ahora generar Java8Lexer y Java8Parser usando el comando:

    antlr4 -visitor Java8.g4

  4. Esto va a generar varios archivos como Java8BaseListener.javaJava8BaseVisitor.javaJava8Lexer.javaJava8Lexer.tokensJava8Listener.javaJava8Parser.javaJava8.tokensJava8Visitor.java

Use este código para generar 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)); 
      } 
     } 
    } 
} 

Después de que haya terminado la codificación puede utilizar Gradle para construir su proyecto o se puede descargar antlr-4.7.1-complete.jar en el directorio del proyecto y empezar a recopilar.

Si quieres una la salida en un archivo DOT de manera que u puede visualizar el AST continuación, se puede hacer referencia a this posterior QnA o se refieren directamente a esta repository en el que he utilizado Gradle para construir el proyecto.

Espero que esto ayude. :)

12

OK, aquí están los pasos:

  1. ir a la ANTLR Site y descargar la última versión ahora es 4.7
  2. Descargar las Java.g y los archivos de JavaTreeParser.ghere.
  3. ejecute los siguientes comandos:

    java -jar antlrTool Java.g 
    java -jar antlrTool JavaTreeParser.g 
    
  4. se generarán

    5 archivos :

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

uso de este código Java para generar la sintaxis abstracta del árbol y para imprimirlo:

 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

Gracias @Aboelnour. Pero la página a la que hace referencia ya no existe. ¿alguna ayuda? –

+0

Otra pregunta, si JavaTreeParser.java no se encuentra entre los archivos generados, ¿de dónde viene? –

+1

@MakanTayebi Creo que esto ayudaría: https://github.com/antlr/grammars-v4 – ConductedClever

Cuestiones relacionadas