2009-12-28 41 views
33

Por lo que yo sé, la única manera de analizar Java código fuente en un AST (árbol de sintaxis abstracta) es utilizar el Java Compiler Tree API: com.sun.source.tree¿Cómo generar AST a partir del código fuente de Java?

Tengo dos preguntas:

  1. ¿Qué JDKs son compatibles com.sun.source.tree?
  2. ¿Hay un reemplazo portátil que funcione para todos los JDK?
+0

Si no me equivoco, Eclipse usa una versión diferente del modelo de Java con su propio analizador, y podría haber una manera de reutilizarlo para el análisis general. – Uri

+0

¿Qué quiere decir con "apoyo" en su primera pregunta? ¿Estás preguntando qué versiones de Java ofrecen los proveedores con el paquete com.sun.source.tree? Me imagino que solo el de Sun lo hace. Si desea analizar el código fuente con otro JDK (por ejemplo, IBM), probablemente sea necesaria una biblioteca de analizador independiente. –

+0

@Brett, sé que com.sun.source.tree solo se introdujo en JDK6. Me pregunto si todos los JDK que no son de Sun son compatibles con esta API. – Gili

Respuesta

8

Puede tomar las herramientas.jar y usarlas. javac is open source por lo que puede tomar ese código (suponiendo que pueda manejar la licencia). Antlr tiene gramáticas para Java también.

+0

Redistribuir tools.jar: ¡buen punto! La excepción de classpath de OpenJDK es una gran licencia. – Gili

+0

google-java-format usa 'com.google.errorprone: javac-shaded' para obtener el AST. 'javac-shaded' incrusta el analizador OpenJDK en sí mismo. El ejemplo se puede encontrar en 'JavaInputAstVisitor.java' en google-java-format. –

22

En cuanto a su segunda pregunta, hay docenas de analizadores de Java disponibles además de los de Sun. Aquí hay una pequeña muestra:

  • Eclipse's org.eclipse.jdt.core.dom paquete.
  • Spoon da salida a un árbol de análisis sintáctico con anotaciones muy agradable, con información de tipo variable y de unión (y utiliza el analizador de Eclipse internamente)
  • ANTLR es un generador de analizadores sintácticos, pero hay gramáticas para Java disponibles
  • javaparser (que yo no tengo usado)

Mi mejor consejo es probar cada uno de ellos para ver cuál funciona mejor para sus necesidades.

+0

¿Cuál es la diferencia entre jdt DOM de Eclipse y Spoon? – Gili

+1

Las clases AST reales son más o menos análogas, pero el árbol de análisis sintáctico de Spoon incluye información semántica, como el enlace variable, sin que se requiera una infraestructura IDE masiva para ejecutarse. Uno puede analizar y analizar archivos Java simplemente agregando un archivo jar a classpath. –

6

He utilizado el analizador AST de Eclipse. Encontré que era bastante bueno (bueno, era parte de un complemento de Eclipse, así que tenía sentido usarlo). Ver Exploring Eclipse's ASTParser.

1

No es la única manera.

Vea nuestro Java Front End, que es un analizador de Java con todas las funciones construido sobre el DMS Software Reengineering Toolkit. Analiza Java y crea AST como estructuras de datos internas.

El punto de DMS es que proporciona una gran variedad de maquinaria adicional útil (gramáticas de atributos, tablas de símbolos, el análisis, la manipulación AST incluyendo el acceso y actualización de flujo, así como transformaciones de fuente a fuente) para analizar y transformar ese AST en resultados y/o código fuente modificado. Si obtiene "solo" un analizador de Java (por ejemplo, gramática de JavaCC + Java), en mi humilde opinión, no podrá hacer mucho con él. DMS hace que sea posible hacer muchas cosas, sin tener que inventar toda esa maquinaria extra usted mismo.

Si realmente no desea utilizar la maquinaria adicional que proporciona DMS, será dump the tree as XML.

3

Un analizador de Java funcional y fácil de usar es ... JavaParser. El proyecto ha estado activo desde hace algunos años.Si bien inicialmente se alojó en el código de Google, ahora está disponible en GitHub: https://github.com/javaparser/javaparser

Es bastante simple de usar y el número de dependencias es pequeño. También está disponible en Maven.

Se ha utilizado durante algunos años, por lo que funciona bastante bien y permite analizar comentarios, cambiar el AST y regenerar el código.

+0

Gracias por actualizar el enlace al proyecto (se ha movido hace unos meses y mientras tanto me convertí en colaborador de este proyecto: D) –

Cuestiones relacionadas