java - 用于 Java 的 AST 差异提取器

标签 java diff abstract-syntax-tree patch

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

程序 1:

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 中的差异,但是树比较的一般解决方案(不是简单的比较,而是有差异输出)应该在这个地方工作。

最佳答案

终于找到方法了。到目前为止,我已经找到了合适的库(至少我认为是这样),但我仍然有办法在我自己的代码中使用它。

工具是:

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

github 页面:

https://github.com/GumTreeDiff/gumtree

这给了我很棒的输出:

ast diff

关于java - 用于 Java 的 AST 差异提取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160371/

相关文章:

bash - 'diff' 命令可以忽略不同类型的换行符吗?

git - git分支之间某个文件夹的差异

iterator - OCaml 树迭代器

swift - 将 swiftc AST 输出发送到 stderr 的替代方法

java - 如何以编程方式检测检查或识别应用程序是否在 Android Go 版本 8.1 设备上运行

java - 从 try-catch block 返回值的正确方法是什么?

git - 如何获取 GitHub 推送的电子邮件差异?

java - 寻找数组中的最小值

java - GWT TreeViewModel 未按预期工作

haskell - 建立 AST 的非法 Monoid 实例不被认为是有害的?