web-dev-qa-db-fra.com

Comment générer AST from Java code source?

Autant que je sache, la seule façon d'analyser Java code source dans un AST (Abstract Syntax Tree)) est d'utiliser le Java API de l'arborescence du compilateur : com.Sun.source.tree

J'ai deux questions:

  1. Quels JDK prennent en charge com.Sun.source.tree?
  2. Existe-t-il un remplacement portable qui fonctionne pour tous les JDK?
37
Gili

Vous pouvez éventuellement prendre le tools.jar et l'utiliser. javac est open source donc vous pouvez simplement récupérer ce code (en supposant que vous puissiez gérer la licence). Antlr a des grammaires pour Java également.

8
TofuBeer

En ce qui concerne votre deuxième question, il existe des dizaines d'analyseurs Java) disponibles en plus de ceux de Sun. Voici un petit exemple:

  • Eclipse org.Eclipse.jdt.core.dom package.
  • Spoon génère un très bel arbre d'analyse annoté avec des informations de type et une liaison de variable (et utilise l'analyseur d'Eclipse en interne)
  • ANTLR est un générateur d'analyseurs, mais il existe des grammaires pour Java disponibles
  • javaparser (que je n'ai pas utilisé)

Mon meilleur conseil est d'essayer chacun d'eux pour voir celui qui répond le mieux à vos besoins.

23
Brett Daniel

J'ai utilisé l'analyseur AST) d'Eclipse. Je l'ai trouvé assez bon (enfin, il faisait partie d'un plug-in Eclipse, il était donc logique de l'utiliser). Voir Explorer l'ASTParser d'Eclipse .

7
Jeremy Raymond

Un outil fonctionnel et simple à utiliser Java Parser is ... JavaParser . Le projet est déjà actif depuis quelques années. Alors qu'il était initialement hébergé sur du code Google, il est maintenant disponible sur GitHub: https://github.com/javaparser/javaparser

Il est assez simple à utiliser et le nombre de dépendances est faible. Il est également disponible sur Maven.

Il est utilisé depuis quelques années, il fonctionne donc plutôt bien et permet d'analyser aussi les commentaires, de changer le AST et de régénérer le code.

3
Federico Tomassetti

Ce n'est pas le seul moyen.

Voir notre Java Front End , qui est un analyseur complet Java parser construit au-dessus du DMS Software Reengineering Toolkit . Il analyse Java, et construit des AST en tant que structures de données internes.

L'intérêt du DMS est qu'il fournit une grande variété de machines utiles supplémentaires (grammaires d'attributs, tables de symboles, analyse de flux, AST manipulation comprenant l'accès et la mise à jour, ainsi que les transformations source-à-source) pour analyser et transformer cela AST en résultats et/ou code source modifié. Si vous obtenez "juste" un Java parser (par exemple, JavaCC + Java grammaire)) vous ne pourrez, à mon humble avis, pas en faire grand-chose. DMS permet de faire un beaucoup, sans avoir à inventer vous-même toutes ces machines supplémentaires.

Si vous ne voulez vraiment pas utiliser les machines supplémentaires fournies par DMS, il videra l'arborescence au format XML .

1
Ira Baxter

Je viens de tomber sur Jexast , une extraction de ASTParser de JDT à travail indépendant d'Eclipse (cela dépend de org.Eclipse.jdt.internal.compiler.**).

Je ne l'ai pas encore essayé, mais cela semble intéressant.

1
Esteban Küber