example java javac abstract-syntax-tree

example - ejemplo de acceso programático de javac.exe AST



javac install (2)

Compila y ejecuta esto con -cp tools.jar (donde tienes que especificar la ubicación de tus tools.jar , obviamente).

import com.sun.source.util.Trees; import javax.tools.JavaCompiler; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; public class JCTreeTest { private static final JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); public static void main(String[] args) { final StandardJavaFileManager jfm = javac.getStandardFileManager(null, null, null); final JavaCompiler.CompilationTask task = javac.getTask(null, jfm, null, null, null, jfm.getJavaFileObjects(args)); final Trees trees = Trees.instance(task); // Do stuff with "trees" } }

Compila y corre por mí, aunque yo no he jugado con los árboles, así que tendrás que leer tú mismo el javadoc . :-) ¡Buena suerte!

¿Es posible acceder al Árbol de sintaxis abstracta (AST) dentro de javac.exe mediante programación? Podría dar un ejemplo?


Sí, es posible, pero solo desde Java 6. Peter von der Ahé habla sobre los dos JSR en esta entrevista . De JSR 199:

La API del compilador JSR 199 consta de tres cosas: la primera básicamente le permite invocar un compilador a través de la API. En segundo lugar, la API le permite personalizar la forma en que el compilador encuentra y escribe los archivos. Me refiero a los archivos en el sentido abstracto, ya que los archivos con los que trata el compilador no están necesariamente en el sistema de archivos. La abstracción de archivos de JSR 199 le permite tener archivos en una base de datos y generar resultados directamente en la memoria, por ejemplo. Finalmente, la API JSR 199 le permite recopilar diagnósticos del compilador de una manera estructurada para que pueda transformar fácilmente mensajes de error, por ejemplo, en líneas en un editor IDE.

JSR 269 es la API de procesamiento de anotaciones.

Este artículo ofrece una excelente descripción general del acceso a la API de Compiler Tree . La sección " Acceso al árbol de sintaxis abstracto: la API del árbol del compilador " parece particularmente adecuada para su pregunta.

Dependiendo de lo que esté haciendo, es posible que también desee consultar el lenguaje de reglas de Jackpot , que es un motor de refactorización independiente que se complementa con el árbol del compilador.