【发布时间】:2011-01-09 00:08:12
【问题描述】:
我正在为我的 CS 课程制定一个反抄袭项目。这涉及通过"Winnowing: Local Algorithms for Document Fingerprinting." 描述的技术检测计算机科学课程(编程作业)中的抄袭行为。
基本上,我要完成一组编程作业。假设其中一项作业如下所示:
public class MyClass
{
public static void main(String[] args)
{
// declare a variable called someVar
int someVar = 0;
}
}
这需要通过前端的词法分析部分来去除我们不想要的代码功能。在这种情况下,我想将所有 Identifier names 重命名为常量“V”并从代码中删除所有 cmets。
为此,我们将使用ANTLR 和各种语言的现有语法来生成适当的词法分析器。
最终结果是这样的:
public class V
{
public static void V(String[] V)
{
int V = 0;
}
}
然后我们去掉所有空格得到:
publicclassV{publicstaticvoidV(String[]V){intV=0;}}
这个字符串然后被分解成预设大小的 k-gram。例如说 k = 5(实际上它会更大):
publi ublic blicc liccl iccla ... =0;}}
问题来了:
每个 k-gram 都使用滚动散列函数进行散列,并且应该在源文本中记录它们的原始字符位置。 k-gram 哈希和字符位置一起形成指纹。
如何在标识符、cmets 和空白的所有前端剥离中跟踪源文本中的 k-gram 原始位置?
这对于程序的最后阶段非常重要,您可以在原始源文本中突出显示成对文档中的匹配项。为了突出 k-gram 哈希的匹配,我需要知道 k-gram 在原始源中的开始和结束位置。
【问题讨论】:
标签: java parsing string antlr lexer