假设我有两个源代码,像这些一样:
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。例如输出如下所示:
它们完全相同,只有红色位置的不同。
Antlr还提供了一个访问机制,该机制将我的访问器作为参数,并从根节点到底部遍历树(如果有帮助)。
问题:
是否有任何API、库或特定算法(已实现或未实现)可获取差异?
就像git或diff-match-patch给出的补丁一样。例如,在上面的示例中,我想知道(获取):
被替换为:
或更精确地说,
作为差异。
更新
虽然我的问题是关于AST的diff,但树比较(不仅仅是简单的比较,还包括diff输出)的通用解决方案应该也适用于这个地方。