ANTLR4比较语法树

时间:2015-04-18 08:04:56

标签: java abstract-syntax-tree antlr4

如何比较ANTLR4中生成AST的两个java源代码?我已经尝试使用JavaBaseVisitor和JavaBaseListener来遍历树,但我似乎无法从树中得到我需要的东西。我对方法和变量名称不感兴趣,只对它们的类​​型感兴趣。有人可以帮忙吗?感谢。

1 个答案:

答案 0 :(得分:2)

要查明源代码B是否包含来自代码A的剽窃(复制?)代码,仅仅从它们的根开始“比较”A和B的AST是不够的。你必须找出它们有什么共同点,这种共性可以分布在任意子树上。这不是一件容易的事。

这是我1998年关于如何在大型代码库中找到克隆代码(即类似代码)的技术论文(想想“很多树”):

Clone Detection Using Abstract Syntax Trees (Baxter et al)

这会在代码库中查找最大变化点数(参数)不同的子树,同时仍具有相同树节点的最小阈值。

只给出A和B的两个AST,这将在A或B中找到A中代码位的 near-miss 重复。本文提供了可以在ANTLR上使用的算法(或任何其他树木。

如果过滤掉与A的其他部分类似的A部分(它们在实践中总是存在,程序超过最小尺寸),剩下的部分是A的部分类似于B.你想过滤出与B的其他部分相似的B部分。

您可以直接实施克隆算法,然后过滤检测到的克隆,或者您可以稍微修改算法,以便不提出A的克隆,A,B和B等。

实际上,您可能希望对树的两个执行此操作,A和B,因为软件通常由一组源文件组成。