Java 的 AST 差异提取器
AST Diff Extractor for Java
假设我有两个像这样的源代码:
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[i + 1];
.
相比,int temp = numbers[i] + numbers[1];
行彼此不同
感谢 antlr,我可以提取这些代码的 AST。例如输出是这样的:
它们完全相同,但用红色指定的位置。
Antlr 还提供了一种访问机制,可以让我的访问者从根到底部访问树(如果有帮助的话)。
问题:
是否有任何 API、库或特定算法(已实施或未实施)来取差?
喜欢 git 或 diff-match-patch 给出的补丁。比如上面的例子,我想知道(得到)那个,
替换为:
或更准确,
作为差异。
更新
虽然我的问题是关于 ASTs 中的 diff,但是树比较的一般解决方案(不是简单的比较,而是有 diff 输出)应该在这个地方工作。
终于找到方法了。到目前为止,我已经找到了合适的库(至少我认为),但我仍然有办法在我自己的代码中使用它。
工具是:
http://www.labri.fr/perso/falleri/perso/tools/gumtree/
github 页:
https://github.com/GumTreeDiff/gumtree
这给了我很棒的输出:
假设我有两个像这样的源代码:
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[i + 1];
.
int temp = numbers[i] + numbers[1];
行彼此不同
感谢 antlr,我可以提取这些代码的 AST。例如输出是这样的:
它们完全相同,但用红色指定的位置。
Antlr 还提供了一种访问机制,可以让我的访问者从根到底部访问树(如果有帮助的话)。
问题:
是否有任何 API、库或特定算法(已实施或未实施)来取差?
喜欢 git 或 diff-match-patch 给出的补丁。比如上面的例子,我想知道(得到)那个,
替换为:
或更准确,
作为差异。
更新
虽然我的问题是关于 ASTs 中的 diff,但是树比较的一般解决方案(不是简单的比较,而是有 diff 输出)应该在这个地方工作。
终于找到方法了。到目前为止,我已经找到了合适的库(至少我认为),但我仍然有办法在我自己的代码中使用它。
工具是:
http://www.labri.fr/perso/falleri/perso/tools/gumtree/
github 页:
https://github.com/GumTreeDiff/gumtree
这给了我很棒的输出: