Pregunta

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

¿Fue útil?

Solución

Sí, es posible, pero solo desde Java 6. Peter von der Ah & # 233; 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 cómo el compilador encuentra y escribe archivos. Me refiero a los archivos en sentido abstracto, ya que los archivos 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 forma estructurada para que pueda transformar fácilmente mensajes de error, por ejemplo, en líneas en el editor de un IDE.

JSR 269 es la API de procesamiento de anotaciones.

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

Dependiendo de lo que esté haciendo, también puede consultar el Jackpot Rule Language , que es un motor de refactorización independiente que se conecta al Compiler Tree.

Otros consejos

Compile y ejecute esto con -cp tools.jar (donde debe especificar la ubicación de su 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"
    }
}

Se compila y se ejecuta para mí, aunque no he jugado con los árboles, así que tendrás que lea el javadoc usted mismo. :-) ¡Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top