2009-12-28 13 views
33

Per quanto ne so, l'unico modo per analizzare Java codice sorgente in un AST (Abstract Syntax Tree) è quello di utilizzare il Java Compiler Tree API: com.sun.source.treeCome generare AST dal codice sorgente Java?

Ho due domande:

  1. Quali JDK supportano com.sun.source.tree?
  2. C'è una sostituzione portatile che funzioni per tutti i JDK?
+0

Se non sbaglio, Eclipse utilizza una versione diversa del modello Java con il proprio parser e potrebbe esserci un modo per riutilizzarlo per l'analisi generale. – Uri

+0

Cosa intendi per "supporto" nella tua prima domanda? Stai chiedendo quali versioni di Java da cui i fornitori contengono il pacchetto com.sun.source.tree? Immagino solo di Sun. Se si desidera analizzare il codice sorgente con un altro JDK (ad esempio, IBM), è probabilmente necessaria una libreria parser indipendente. –

+0

@Brett, so che com.sun.source.tree è stato introdotto solo in JDK6. Mi chiedo se tutti i JDK non Sun supportino questa API. – Gili

risposta

8

È possibile prendere gli strumenti.jar e utilizzarlo. javac is open source in modo da poter afferrare quel codice (supponendo che tu possa gestire la licenza). Antlr ha anche grammatiche per Java.

+0

Ridistribuzione di tools.jar: buon punto! L'eccezione del classpath di OpenJDK rende un'ottima licenza. – Gili

+0

Il formato google-java utilizza 'com.google.errorprone: javac-shaded' per ottenere l'AST. 'javac-shaded' incorpora il parser OpenJDK in sé stesso. L'esempio può essere trovato in 'JavaInputAstVisitor.java' nel formato google-java. –

22

Per quanto riguarda la seconda domanda, oltre a Sun's sono disponibili decine di parser Java. Ecco un piccolo esempio:

  • Pacchetto di Eclipse org.eclipse.jdt.core.dom.
  • Spoon uscita un bel albero sintattico annotato con informazioni di tipo e di variabile (e utilizza parser di Eclipse internamente)
  • ANTLR è un parser-generatore, ma ci sono grammatiche per Java disponibile
  • javaparser (che non ho usato)

Il mio miglior consiglio è provare ognuno di loro a vedere quale funziona meglio per le proprie esigenze.

+0

Qual è la differenza tra jdt DOM e Spoon di Eclipse? – Gili

+1

Le classi AST sono approssimativamente analoghe, ma l'albero di analisi di Spoon include informazioni semantiche come l'associazione di variabili senza che sia necessaria una massiccia infrastruttura IDE. È possibile analizzare e analizzare i file Java semplicemente aggiungendo un file jar al classpath. –

6

Ho usato il parser AST di Eclipse. L'ho trovato abbastanza buono (beh, faceva parte di un plug-in Eclipse, quindi era logico utilizzarlo). Vedi Exploring Eclipse's ASTParser.

1

Non è l'unico modo.

Vedere il nostro Java Front End, che è un parser Java completo che si basa su DMS Software Reengineering Toolkit. Analizza Java e crea AST come strutture di dati interne.

Il punto di DMS è che fornisce una grande varietà di ulteriori macchine utile (grammatiche attributo, tabelle di simboli, flusso analisi, manipolazione AST compreso l'accesso e l'aggiornamento, nonché le trasformazioni source-to-source) per analizzare e trasformare AST in risultati e/o codice sorgente modificato. Se ottieni "solo" un parser Java (ad esempio, la grammatica JavaCC + Java), IMHO, non sarai in grado di fare molto con esso. DMS rende possibile fare molto, senza dover inventare tutto quel macchinario in più da solo.

Se davvero non si desidera utilizzare i macchinari aggiuntivi forniti da DMS, verrà effettuato il numero dump the tree as XML.

3

Un parser Java semplice e funzionante è ... JavaParser. Il progetto è attivo già da alcuni anni.Mentre inizialmente era ospitato sul codice Google, ora è disponibile su GitHub: https://github.com/javaparser/javaparser

È abbastanza semplice da utilizzare e il numero di dipendenze è ridotto. È anche disponibile su Maven.

È stato utilizzato per alcuni anni, quindi funziona abbastanza bene e consente di analizzare anche i commenti, modificare l'AST e rigenerare il codice.

+0

Grazie per aver aggiornato il link al progetto (è stato spostato alcuni mesi fa e nel frattempo sono diventato un contributore a questo progetto: D) –

Problemi correlati