如何比较ANTLR4中生成AST的两个java源代码?我已经尝试使用JavaBaseVisitor和JavaBaseListener来遍历树,但我似乎无法从树中得到我需要的东西。我对方法和变量名称不感兴趣,只对它们的类型感兴趣。有人可以帮忙吗?感谢。
答案 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,因为软件通常由一组源文件组成。