什么是合适的词法分析器生成器,我可以用来从许多语言源文件中删除标识符?

时间:2010-01-22 19:49:11

标签: java parsing lexer

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

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

我们基本上采用k-gram哈希学生的源代码并在数据库中查找相关匹配(以及我们如何确定选择哪些哈希作为文档指纹的优化)。

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

请注意,有些语言无法完成您尝试做的事情。具体而言,那些根据语法无法确定变量是什么或不是变量的那些。 Tcl就是这样的一个例子,但是有很多动态语言存在同样的问题(Lisp?)。

答案 3 :(得分:0)

acacia-lex lexer有方法替换。

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

在replace方法输入map中提供info,用哪个标识符类型替换为哪个常量(object),   例如," ident1" - > " ident1"," ident2" - > " ident2&#34 ;.