Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Java的AST Diff提取器_Java_Diff_Abstract Syntax Tree_Patch - Fatal编程技术网

用于Java的AST Diff提取器

用于Java的AST Diff提取器,java,diff,abstract-syntax-tree,patch,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;

假设我有两个类似的源代码:

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

}
公共类MathUtils4M0
{
public int getMaxAdjacentSum(int[]个数)
{
if(numbers==null | | numbers.length<2){
返回0;
}否则{
int max=整数的最小值;
对于(int i=0;i最大值){
最大值=温度;
}
}
返回最大值;
}
}
}
方案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;
        }
    }

}
公共类数学4M92
{
public int getMaxAdjacentSum(int[]个数)
{
if(numbers==null | | numbers.length<2){
返回0;
}否则{
int max=整数的最小值;
对于(int i=0;i最大值){
最大值=温度;
}
}
返回最大值;
}
}
}
int temp=numbers[i]+numbers[1]行中彼此不同
int temp=数字[i]+数字[i+1]相比

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

它们彼此完全相同,但位置由红色指定

Antlr还提供了一个访问机制,它将我的访问者从根访问到树的底部(如果有帮助的话)

问题是:

是否有任何API、库或特定算法(实现或未实现)来实现差异

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

替换为:

或者更准确地说

正如区别一样

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

最后我找到了一种方法。到目前为止,我已经找到了正确的库(至少我认为是这样),但我仍然有办法在自己的代码中使用它

该工具是:

使用github页面,共页:

这给了我一个很棒的输出:


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

该工具是:

使用github页面,共页:

这给了我一个很棒的输出:


请参阅我们的SmartDifferenticer工具,该工具可执行此操作并将结果报告为增量。请参阅我们的SmartDifferenticer工具,该工具可执行此操作并将结果报告为增量。