ANTLR4 比较语法树

ANTLR4 comparing syntax trees

如何比较两个 java 源代码在 ANTLR4 中生成的 AST?我已经尝试使用 JavaBaseVisitor 和 JavaBaseListener 在树中行走,但我似乎无法从树中获得我需要的东西。我对方法和变量名不感兴趣,只对它们的类​​型感兴趣。谁能帮忙?谢谢。

要查明源代码 B 是否包含抄袭(复制?)代码 A 的代码,仅从根部开始对 A 和 B 进行 "compare" AST 是不够的。您必须找到找出它们的共同点,并且这种共性可能分布在任意子树中。这不是一件容易的事。

这是我 1998 年关于如何在大型代码库中查找克隆代码(即相似代码)的技术论文(想想 "many trees"):

Clone Detection Using Abstract Syntax Trees (Baxter et al)

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

给定 A 和 B 的两个 AST,这将在 A 或 B 中找到 near-miss 代码位重复项。该论文提供了您可以在 ANTLR(或任何其他)树上使用。

如果你过滤掉 A 中与 A 的其他部分相似的部分(它们在实践中总是存在,程序超过最小大小),剩下的就是 A 中与 B 相似的部分.同样你想过滤掉B中与B的其他部分相似的部分

您可以直接实现克隆算法,然后过滤检测到的克隆,或者您可以稍微修改算法以简单地不建议 A 与 A、B 与 B 等的克隆

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