Java的AST Diff提取工具

3
假设我有两个源代码,像这些一样: prog1:
public class MathUtils4M0
{

    public  int getMaxAdjacentSum( int[] numbers )
    {
        if (numbers == null || numbers.length < 2) {
            return 0;
        } else {
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < numbers.length * 1; i++) {
                int temp = numbers[i] + numbers[i + 1];
                if (temp > max) {
                    max = temp;
                }
            }
            return max;
        }
    }

}

程序2:

public class MathUtils4M92
{

    public  int getMaxAdjacentSum( int[] numbers )
    {
        if (numbers == null || numbers.length < 2) {
            return 0;
        } else {
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < numbers.length - 1; i++) {
                int temp = numbers[i] + numbers[1];
                if (temp > max) {
                    max = temp;
                }
            }
            return max;
        }
    }

}

在行中,与int temp = numbers[i] + numbers[i + 1];相比,int temp = numbers[i] + numbers[1];是不同的。

我可以使用antlr提取这些代码的AST。例如输出如下所示:

AST comparision

它们完全相同,只有红色位置的不同。

Antlr还提供了一个访问机制,该机制将我的访问器作为参数,并从根节点到底部遍历树(如果有帮助)。

问题:

是否有任何API、库或特定算法(已实现或未实现)可获取差异?

就像git或diff-match-patch给出的补丁一样。例如,在上面的示例中,我想知道(获取):

before

被替换为:

after

或更精确地说,

diff

作为差异。

更新

虽然我的问题是关于AST的diff,但树比较(不仅仅是简单的比较,还包括diff输出)的通用解决方案应该也适用于这个地方。


请查看我们的SmartDifferencer工具,它可以执行此操作并将结果报告为增量。http://www.semanticdesigns.com/Products/SmartDifferencer/ - Ira Baxter
1个回答

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接