Programming languages 识别代码库中的频繁公式

Programming languages 识别代码库中的频繁公式,programming-languages,text,compression,language-design,text-processing,Programming Languages,Text,Compression,Language Design,Text Processing,我的公司维护一种特定于领域的语言,在语法上类似于Excel公式语言。我们正在考虑在语言中添加新的内置项。一种方法是识别代码库中重复使用的详细命令。例如,如果我们看到人们总是编写相同的100个字符的命令来从字符串的开头和结尾修剪空白,这表明我们应该添加一个修剪函数 在代码库中查看频繁子字符串列表将是一个良好的开端,尽管有时由于使用的变量名不同,频繁使用的命令会相差几个字符 我知道有很多成熟的算法可以做到这一点,但首先我想看看我是否可以避免重新发明轮子。例如,我知道这个概念是许多压缩算法的基础,那么

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

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


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

您可能需要研究一下。在我查找的那一分钟内,我找不到任何来源,但这里有一个在线来源:
这可能不起作用,因为它使用空格作为分隔符。

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

然后,您将能够运行查询,并能够看到最常用的公式,哪些公式显示在彼此旁边,等等

以下是一篇快速入门文章:


串匹配只是低挂果实,明显的例子。更困难的情况是你在做相似的事情,但顺序不同。例如,假设您有:

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

您还可以应用简化规则,以便将复杂函数计算为更简单的函数,例如:

(X * A) + ( X * B)
X * ( A + B )
那些也是一样的!字符串匹配在这方面帮不了你

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

此外,如果您有Trim等现有函数,则可以获取该函数的AST,并查看它是否与正在评估的函数中的子树匹配。