2011-12-12 12 views
7

¿Existe una API de código abierto api que permita comparar dos árboles de sintaxis abstracta del código fuente de Java?API para comparar AST?

Me gustaría ver las diferencias entre los dos árboles de sintaxis, de forma similar a cómo se hace en las herramientas diff.

Respuesta

6

herramientas más diff compara líneas, no árboles de sintaxis (ver Wikipedia article for discussion).

Existen algunos artículos techical que hablan de cómo hacerlo árbol de sintaxis se compara, por ejemplo, Diff/TS: A Tool for Fine-Grained Structural Change Analysis

No hay API para calcular las diferencias del árbol disponibles en cualquier lugar por lo que yo sé. El problema es más complejo de lo que parece al principio, si quieres obtener una diferencia mínima. Pero la técnica básica es usar alguna variación de Levenstein distance metrics.

Tuvimos que rodar el nuestro para nuestra línea de SmartDifferencers; afortunadamente, tenemos muchos interfaces para muchos lenguajes para producir AST precisos.

Usted termina con sorpresas adicionales, como las personas que quieren comparar comentarios a pesar de que lo que tiene son AST, querer comparar archivos rotos, comparar dialectos de idiomas que su gramática no coincide o códigos que contiene inserciones de otros lenguajes, etc. Do diff por líneas no tiene estos problemas, que es una razón por la cual diff de línea está muy extendido y tree-diff no lo es.

2

me pregunto si hay una extensión antlr algún lugar que puede hacer esto ....

http://www.antlr.org/

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

+2

es fácil conseguir el AS T de archivos fuente, es otra historia para descubrir las similitudes entre ellos :). Uno de los gurús de análisis local aquí en stackoverflow, [Ira Baxter] (http://stackoverflow.com/users/120163/ira-baxter), habla sobre esto en un [Google Tech Talk] (http://www.youtube .com/watch? v = C-_dw9iEzhA) donde menciona que su software hace esto. –

+0

muy cierto: depende de lo que quiera 'comparar'. Tal vez sería mejor definir, AST podría no ser lo mejor para usar. –

6

Sí, hay implementaciones libres se pueden generar diferencias de árbol de salida:

gu (rápido, multi languague, se integra con GIT): http://www.labri.fr/perso/falleri/perso/tools/gumtree/ https://github.com/jrfaller/gumtree

ChangeDistiller (bastante madura, construido como una biblioteca independiente) : https://bitbucket.org/sealuzh/tools-changedistiller/wiki/Home

CodingSpectator (diffing ast está codificada en el resto del código): https://github.com/vazexqi/CodingSpectator/tree/codingtracker-ast-inference

+0

vea también https://github.com/SpoonLabs/gumtree-spoon-ast-diff –