识别代码库中的频繁公式

时间:2010-07-01 18:58:49

标签: programming-languages text compression language-design text-processing

我的公司维护一种特定于域的语言,在语法上类似于Excel公式语言。我们正在考虑为该语言添加新的内置函数。一种方法是识别在我们的代码库中重复使用的详细命令。例如,如果我们看到人们总是编写相同的100个字符的命令来从字符串的开头和结尾修剪空白,那么这表明我们应该添加trim函数。

在代码库中查看频繁子串的列表将是一个良好的开端(尽管由于使用了不同的变量名,有时常用的命令会因几个字符而不同)。

我知道有很好的算法可以做到这一点,但首先我想知道我是否可以避免重新发明轮子。例如,我知道这个概念是许多压缩算法的基础,那么是否有一个压缩模块可以让我检索频繁子串的字典?任何其他想法将不胜感激。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用现有的全文索引器,例如Lucene,并实现您自己的分析器以及特定于您的公式语言的Tokenizer

然后,您就可以运行查询,并能够查看最常用的公式,哪些公式彼此相邻,等等。

这是一篇快速的文章,可以帮助您入门:

Lucene Analyzer, Tokenizer and TokenFilter

答案 1 :(得分:0)

字符串匹配只是低悬的果实,显而易见的情况。更难的情况是你在做类似的事情,但顺序不同。例如,假设你有:

X+Y
Y+X

你的字符串匹配方法不会意识到那些有效相同。如果你想更深入一点,我认为你需要将公式解析为AST并实际比较AST。如果你这样做,你可以看到树实际上是相同的,因为二元运算符'+'是可交换的。

您还可以应用缩减规则,以便将复杂函数评估为更简单的函数,例如:

(X * A) + ( X * B)
X * ( A + B )

那些也是一样的!字符串匹配对你没有帮助。

  1. 解析为AST
  2. 减少和优化功能
  3. 将生成的AST与其他AST进行比较
  4. 如果找到匹配项,则用调用共享函数替换它们。

答案 2 :(得分:-1)

您可能需要查看tag-cloud generators。在我看的那一刻我找不到任何来源,但这是一个在线的: http://tagcloud.oclc.org/tagcloud/TagCloudDemo这可能无效,因为它使用空格作为分隔符。