3

我正在为我的大学开展一个小组项目,该项目将用于计算机科学中的抄袭检测。

我的小组主要使用这篇期刊文章中描述的散列/指纹技术:Winnowing: Local Algorithms for Document Fingerprinting这与MOSS抄袭检测系统的工作方式非常相似。

我们基本上是在获取同学源代码的 k-gram 散列,并在数据库中查找相关匹配项(以及在我们如何确定选择哪些散列作为文档指纹方面进行大量优化)。

我们项目的第一个方面是它的“前端”部分,它将包含有关我们的检测系统可以处理的每种文件格式的一些语义知识。这将允许我们从文档中删除一些我们不再需要的用于剽窃检测的细节。基本上,我们希望能够将各种编程语言中的所有变量重命名为常量字符串或字母。

我们可以使用什么轻量级解决方案(词法分析器生成器或类似的东西)来帮助将不同语言源代码文件中的所有变量重命名为常量?

我们的项目是用 Java 编写的。

理想情况下,我只想能够为每种语言定义一个语法,然后我们的前端将能够将该语言源文件中的所有标识符重命名为某个常量。然后,我们将为我们想要支持的每种文件格式(java、c++、python 等)执行此操作。

4

4 回答 4

3

对于词法分析器/解析器生成器,您应该查看 ANTLR。TXL,这是一个文本转换解释器,也值得一看。现成的语法应该适用于两者。

于 2010-01-22T19:56:41.273 回答
1

除了已经建议的 ANTLR 之外,您还可以查看JFlex

于 2010-01-22T20:10:57.977 回答
0

请注意,有些语言实际上无法完成您想做的事情。具体来说,那些无法根据语法确定什么是或不是变量的地方。Tcl 就是一个例子,但是有许多动态语言有同样的问题(Lisp?)。

于 2010-01-22T20:00:34.273 回答
0

acacia-lex词法分析器有方法替换。

在 Lexer 令牌定义中,看起来像标识符,例如,“ident1” -> “[a..d]”,“ident2” -> “[e..h]”。

在替换方法输入映射中提供信息,用哪个标识符类型替换哪个常量(对象),例如,“ident1”->“ident1”,“ident2”->“ident2”。

于 2012-11-11T23:56:37.740 回答