用于比较AST的API?

有没有一个开源java api,它允许比较两个抽象语法树的java源代码?

我想看看两个语法树之间的差异,类似于在diff工具中完成的方式。

大多数diff工具比较行,而不是语法树(请参阅Wikipedia文章以供讨论 )。

有一些技术论文谈论如何进行语法树比较,例如, Diff / TS:用于细粒度结构变化分析的工具

据我所知,在任何地方都没有用于计算树差异的API。 如果你想获得最小的差异,问题比第一次听起来更复杂。 但基本技术是使用Levenstein距离度量的一些变化。

我们不得不为我们的SmartDifference系列推出自己的产品 ; 幸运的是,我们有很多很好的前端可以产生准确的AST。

你最终会有额外的惊喜,例如想要比较评论的人,尽管你拥有AST是什么,想要比较破碎的文件,比较你的语法不匹配的语言方言,或者包含插入的代码其他语言等等。按行进行差异没有这些问题,这是line-diff普遍存在而tree-diff不存在的一个原因。

是的,有输出树差异的免费实现:

gumtree(快速,多语言,与git集成): http : //www.labri.fr/perso/falleri/perso/tools/gumtree/ https://github.com/jrfaller/gumtree

ChangeDistiller(非常成熟,作为一个独立的库构建): https : //bitbucket.org/sealuzh/tools-changedistiller/wiki/Home

CodingSpectator(ast diffing在其余代码中硬编码): https : //github.com/vazexqi/CodingSpectator/tree/codingtracker-ast-inference

我想知道是否有一个可以做到这一点的ANTLR扩展….

http://www.antlr.org/

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