0

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

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

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

4

3 回答 3

0

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

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

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

Lucene Analyzer、Tokenizer 和 TokenFilter

于 2010-07-01T19:19:21.597 回答
0

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

X+Y
Y+X

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

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

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

那些也是一样的!字符串匹配不会帮助你。

  1. 解析成 AST
  2. 减少和优化功能
  3. 将生成的 AST 与其他 AST 进行比较

如果您找到匹配项,则将它们替换为对共享函数的调用。

于 2010-09-23T17:31:46.593 回答
-1

您可能想查看tag-cloud generators。在我花时间寻找的那一刻,我找不到任何来源,但这里有一个在线来源:http: //tagcloud.oclc.org/tagcloud/TagCloudDemo它可能不起作用,因为它使用空格作为分隔符。

于 2010-07-01T19:13:24.547 回答