Java 如何在转换过程中跟踪字符串中的原始字符位置?
我正在为我的CS班做一个反剽窃项目。这涉及到检测计算机科学课程(编程作业)中的剽窃行为,方法如下所述 基本上,我正在做一组编程作业。假设其中一个作业如下所示: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; } } 这需要通过前端的词法分析部分来去除我们
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跟踪源流中的令牌位置
- 将注释和空白移到隐藏通道
- 将标识符标记的
属性设置为“V”Text
- 查看每个令牌的
属性,对Text
运行滚动哈希CommonTokenStream
标记从头到尾保持不变,映射也会保留。ANTLR lexer跟踪标记在源流中的位置
- 将注释和空白移到隐藏通道
- 将标识符标记的
属性设置为“V”Text
- 查看每个令牌的
属性,对Text
运行滚动哈希CommonTokenStream
标记从头到尾都完好无损,映射也会保留下来。嘿,为什么要使用此步骤: 然后将该字符串分解为预设大小的k克。例如,假设k=5(实际上它会更大): 公共暴动,暴动,暴动=0;}}
我的意思是,为什么剽窃检测需要这个步骤?嘿,为什么要使用这个步骤: 然后将该字符串分解为预设大小的k克。例如,假设k=5(实际上它会更大): 公共暴动,暴动,暴动=0;}}
我的意思是,为什么剽窃检测需要这样做?另请参见这个类似的问题:另请参见这个类似的问题:阅读我上面给出的PDF链接。基本上,通过将源代码拆分为k-gram并对其进行散列,您可以检测文档之间的匹配情况,而不必考虑重新排序和空格。基本上,通过将源代码拆分为k-gram并对其进行散列,您可以检测文档之间的匹配,而不必考虑重新排序和空格。
publi ublic blicc liccl iccla ... =0;}}