代码之家  ›  专栏  ›  技术社区  ›  mmcdole

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

  •  1
  • mmcdole  · 技术社区  · 15 年前

    我的反剽窃项目。这包括检测计算机科学课程(编程作业)中的剽窃行为,通过一种描述的技术 "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 以及各种语言的现有语法来生成适当的lexer。

    最终结果是:

    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-grams在源文本中的原始位置?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Sam Harwell    15 年前

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

    • 将注释和空白移到隐藏通道
    • Text 标识符标记的属性为“V”
    • 对一个 CommonTokenStream ,看着 每个令牌的属性。

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

        2
  •  0
  •   Harsh Gidra    15 年前

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

    然后,这个字符串被分解成一个预设大小的k-gram。例如,假设k=5(实际上它会更大):