2011-12-12 5 views
7

Esiste un Java Java open source che consente di confrontare due Abstract Syntax Trees del codice sorgente java?API per confrontare AST?

Mi piacerebbe vedere le differenze tra i due alberi di sintassi, in modo simile a come è fatto in strumenti diff.

risposta

6

strumenti maggior diff confronto linee, non alberi di sintassi (vedi Wikipedia article for discussion).

Ci sono alcune carte Techical che parlano di come fare albero di sintassi confronta, per esempio, Diff/TS: A Tool for Fine-Grained Structural Change Analysis

ci sono le API per il calcolo delle differenze di alberi disponibili ovunque per quanto ne so. Il problema è più complesso di quanto non sembri, se si vuole ottenere una differenza minima. Ma la tecnica di base è utilizzare alcune varianti di Levenstein distance metrics.

Abbiamo dovuto eseguire il rollover per la nostra linea di SmartDifferencers; fortunatamente, abbiamo molti ottimi front end per molte lingue per produrre AST accurati.

Si ottengono ulteriori sorprese, come le persone che vogliono confrontare i commenti nonostante il fatto che ciò che si possiede sono AST, che vogliono confrontare i file danneggiati, confrontare dialetti della lingua che la grammatica non corrisponde, o codici che contengono inserimenti di altri linguaggi, ecc. La differenza tra le righe non ha questi problemi, che è una ragione per cui diff è diffuso e il diff albero non lo è.

2

mi chiedo se non v'è un'estensione ANTLR da qualche parte che può fare questo ....

http://www.antlr.org/

http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g

+2

E 'facile ottenere la AS T dei file sorgente, è un'altra storia per scoprire le somiglianze tra di loro :). Sui guru del parsing locale qui a StackOverflow, [Ira Baxter] (http://stackoverflow.com/users/120163/ira-baxter), ne parla in un [Google Tech Talk] (http://www.youtube .com/watch? v = C-_dw9iEzhA) dove dice che il suo software fa questo. –

+0

molto vero - dipende da cosa intendi "confrontare". Forse sarebbe meglio definire, AST potrebbe non essere la cosa migliore da usare. –

6

Sì, ci sono implementazioni libere che diff albero di uscita:

Kijiji (veloce, per il linguaggio, si integra con git): http://www.labri.fr/perso/falleri/perso/tools/gumtree/ https://github.com/jrfaller/gumtree

ChangeDistiller (abbastanza maturo, costruito come una biblioteca autonomo) : https://bitbucket.org/sealuzh/tools-changedistiller/wiki/Home

CodingSpectator (AST diffing è codificato nel resto del codice): https://github.com/vazexqi/CodingSpectator/tree/codingtracker-ast-inference

+0

vedere anche https://github.com/SpoonLabs/gumtree-spoon-ast-diff –