Java 如何在转换过程中跟踪字符串中的原始字符位置?

Java 如何在转换过程中跟踪字符串中的原始字符位置?,java,parsing,string,antlr,lexer,Java,Parsing,String,Antlr,Lexer,我正在为我的CS班做一个反剽窃项目。这涉及到检测计算机科学课程(编程作业)中的剽窃行为,方法如下所述 基本上,我正在做一组编程作业。假设其中一个作业如下所示: public class MyClass { public static void main(String[] args) { // declare a variable called someVar int someVar = 0; } } 这需要通过前端的词法分析部分来去除我们

我正在为我的CS班做一个反剽窃项目。这涉及到检测计算机科学课程(编程作业)中的剽窃行为,方法如下所述

基本上,我正在做一组编程作业。假设其中一个作业如下所示:

public class MyClass
{
    public static void main(String[] args)
    {
        // declare a variable called someVar
        int someVar = 0;
    }
}
这需要通过前端的词法分析部分来去除我们不想要的代码特性。在本例中,我希望将所有标识符名称重命名为常量“V”,并从代码中删除所有注释

为此,我们将使用各种语言的语法和现有语法来生成适当的lexer

最终结果是:

public class V
{
    public static void V(String[] V)
    {
        int V = 0;
    }
}
然后,我们去掉所有空白以获得:

publicclassV{publicstaticvoidV(String[]V){intV=0;}}
然后将该字符串分解为预设大小的k克。例如,假设k=5(实际上它会更大):

问题是:

每个k-gram都使用滚动散列函数进行散列,并且应该记录它们在源文本中的原始字符位置。k-gram散列和字符位置一起构成指纹

我如何在所有标识符、注释和空白的前端剥离中跟踪源文本中的k-grams原始位置


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

ANTLR lexer跟踪源流中的令牌位置

  • 将注释和空白移到隐藏通道
  • 将标识符标记的
    Text
    属性设置为“V”
  • 查看每个令牌的
    Text
    属性,对
    CommonTokenStream
    运行滚动哈希

标记从头到尾保持不变,映射也会保留。

ANTLR lexer跟踪标记在源流中的位置

  • 将注释和空白移到隐藏通道
  • 将标识符标记的
    Text
    属性设置为“V”
  • 查看每个令牌的
    Text
    属性,对
    CommonTokenStream
    运行滚动哈希

标记从头到尾都完好无损,映射也会保留下来。

嘿,为什么要使用此步骤:

然后将该字符串分解为预设大小的k克。例如,假设k=5(实际上它会更大): 公共暴动,暴动,暴动=0;}}


我的意思是,为什么剽窃检测需要这个步骤?

嘿,为什么要使用这个步骤:

然后将该字符串分解为预设大小的k克。例如,假设k=5(实际上它会更大): 公共暴动,暴动,暴动=0;}}


我的意思是,为什么剽窃检测需要这样做?

另请参见这个类似的问题:另请参见这个类似的问题:阅读我上面给出的PDF链接。基本上,通过将源代码拆分为k-gram并对其进行散列,您可以检测文档之间的匹配情况,而不必考虑重新排序和空格。基本上,通过将源代码拆分为k-gram并对其进行散列,您可以检测文档之间的匹配,而不必考虑重新排序和空格。
publi ublic blicc liccl iccla ... =0;}}