¿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
Respuesta
Los setps para generar java src AST usando antlr4 son:
- Instalar antlr4 puede usar el enlace this para hacer eso.
- Después de la instalación, descargue JAVA grammar from here.
Ahora generar Java8Lexer y Java8Parser usando el comando:
antlr4 -visitor Java8.g4
Esto va a generar varios archivos como
Java8BaseListener.java
Java8BaseVisitor.java
Java8Lexer.java
Java8Lexer.tokens
Java8Listener.java
Java8Parser.java
Java8.tokens
Java8Visitor.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. :)
OK, aquí están los pasos:
- ir a la ANTLR Site y descargar la última versión ahora es 4.7
- Descargar las
Java.g
y los archivos deJavaTreeParser.g
here. ejecute los siguientes comandos:
java -jar antlrTool Java.g java -jar antlrTool JavaTreeParser.g
- se generarán
5 archivos :
- Java.tokens
- JavaLexer.java
- JavaParser.java
- JavaTreeParser.g
- 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);
}
}
}
Gracias @Aboelnour. Pero la página a la que hace referencia ya no existe. ¿alguna ayuda? –
Otra pregunta, si JavaTreeParser.java no se encuentra entre los archivos generados, ¿de dónde viene? –
@MakanTayebi Creo que esto ayudaría: https://github.com/antlr/grammars-v4 – ConductedClever
- 1. Convertir el árbol de sintaxis abstracto en código de bytes
- 2. ¿Cómo diseñar partes de un árbol de sintaxis abstracto?
- 3. Cuándo usar un árbol de sintaxis abstracto o concreto?
- 4. Generación de código fuente de Maven Java para Hibernate
- 5. Acceda al árbol de sintaxis abstracto del motor V8
- 6. frameworks de generación de código fuente de Java
- 7. Generación de código Java
- 8. ¿Está lista la generación de código C++ en ANTLR 3.2?
- 9. Problema al compilar el código fuente de Java utilizando ANTLR v3
- 10. Guardar el código fuente con el formato (resaltado de sintaxis)
- 11. ¿Cuál es la diferencia entre un árbol de sintaxis abstracta y un árbol de sintaxis concreta?
- 12. ¿Qué es un árbol sintáctico abstracto/¿Es necesario?
- 13. ¿Qué son los atributos sintetizados en el contexto de la creación de un árbol de sintaxis abstracto?
- 14. Generación de código para el compilador en Haskell
- 15. generación de código Java JPA
- 16. Actualización del árbol AST de ANTLR
- 17. Convertir un árbol de expresión de cadena de código fuente
- 18. Generación de árbol de menú de Java USSD: cómo
- 19. Generación de código con Scala
- 20. Obtener gráfico de flujo de control del árbol de sintaxis abstracta
- 21. ¿Dónde está el código fuente del compilador de Java?
- 22. resaltado de sintaxis de código fuente para trac?
- 23. Pruebas unitarias de generación automática para el código Java heredado
- 24. Usando ANTLR para analizar y modificar el código fuente; ¿Lo estoy haciendo mal?
- 25. Generación de árbol de directorios Pseudorandom?
- 26. Generación de código Python con pyside-uic
- 27. ¿Cómo puedo usar el árbol de sintaxis abstracto Eclipse de Java en un proyecto fuera de Eclipse? (es decir, no un plugin de eclipse)
- 28. Sintaxis del cuantificador de rango en ANTLR Regex
- 29. Búsqueda de código fuente con Google Desktop
- 30. Generación de documentación de código fuente XMLDoc Delphi
Demasiado ancho. Comience con el tutorial de ANTLR o busque gramáticas existentes. – millimoose
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. –
¿puede por favor publicar enlaces o tutoriales útiles? Gracias – Aboelnour