如何在变换中跟踪字符串中的原始字符位置?

时间:2010-01-25 07:39:25

标签: java parsing string antlr lexer

我正在为我的CS课程开展反抄袭项目。这包括通过描述的"Winnowing: Local Algorithms for Document Fingerprinting."

技术检测计算机科学课程(编程任务)中的剽窃行为。

基本上,我正在进行一组编程任务。让我们说其中一个任务看起来像这样:

public class MyClass
{
    public static void main(String[] args)
    {
        // declare a variable called someVar
        int someVar = 0;
    }
}

这需要通过前端,词法分析部分来删除我们不想要的代码的功能。在这种情况下,我想将所有标识符名称重命名为常量“V”,并从代码中删除所有注释

为此,我们将使用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散列和字符位置一起形成指纹。

如何在标识符,注释和空格的所有前端剥离中跟踪源文本中的k-gram原始位置?

这对于程序的最后阶段至关重要,您可以在原始源文本中突出显示文档对中的匹配项。为了突出k-gram哈希的匹配,我需要知道k-gram在原始源中开始和结束的位置。

2 个答案:

答案 0 :(得分:1)

ANTLR词法分析器跟踪源流中的令牌位置。

  • 将评论和空白移至隐藏频道
  • 将标识符标记的Text属性设置为“V”
  • 针对CommonTokenStream运行滚动哈希,查看每个令牌的Text属性。

从开始到结束,令牌保持完整,您也可以保留映射。

答案 1 :(得分:0)

嘿,为什么要使用这一步:

然后将该字符串分解为预设大小的k-gram。例如,假设k = 5(实际上它会更大): publi ublic blicc liccl iccla ... = 0;}}

我的意思是为什么这需要抄袭检测?