适用于Java的AST Diff Extractor

时间:2017-09-11 16:31:46

标签: java diff abstract-syntax-tree patch

假设我有两个像这样的源代码:

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;
        }
    }

}

PROG2:

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[1];相比,行int temp = numbers[i] + numbers[i + 1];中的

彼此不同。

由于antlr,我可以提取这些代码的AST。例如,输出如下:

AST comparision

彼此完全相同,但红色指定的位置。

Antlr还提供了一种访问机制,它可以访问我的访问者并从根访问树(如果有帮助)。

问题:

是否有任何API,库或特定算法(已实施或未实施)以消除差异?

类似于git或diff-match-patch提供的补丁。例如,在上面的例子中,我想知道(得到),

before

替换为:

after

或更准确,

diff

作为差异。

更新

虽然我的问题是关于AST中的差异,但是树比较的一般解决方案(不是简单的比较,但是使用diff输出)应该在这个地方工作。

1 个答案:

答案 0 :(得分:2)

最后我找到了办法。到现在为止,我找到了正确的库(至少我认为),但我仍然有办法在我自己的代码中使用它。

该工具是:

http://www.labri.fr/perso/falleri/perso/tools/gumtree/

使用github页面:

https://github.com/GumTreeDiff/gumtree

给了我很棒的输出:

ast diff