解析相同语法的不同文件并计算文件以保存相似性

时间:2011-05-02 12:24:46

标签: perl parsing acpi parse-recdescent

我有一堆ACPI源语言文件,我想计算文件以保存它们之间的相似性。我想过使用像Perl的Parse :: RecDescent这样的东西 但我被困在:

1)将ACPI语法(www.acpi.info/DOWNLOADS/ACPIspec40a.pdf)翻译成Parse :: RecDescent会理解的东西 2)有一个度量来比较2个解析文件

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

  1. 要开始使用Parse :: RecDescent,您可以查看Pro Perl Parsing, Ch. 5或 在Advanced Perl Programming, Ch. 2
  2. Xml Diff工具应该适合比较分层结构数据;也许你可以将这样的工具应用于以XML格式保存的AST

答案 1 :(得分:1)

所以你有两个问题:

  • 解析ACPI以构建AST。这有一个常见的麻烦,即确保你有一个定义良好的语法,你的解析机器可以根据该语法进行解析(通常你必须弯曲一个好的语法定义以使解析机器能够处理它),并建立一个相应的AST 。你会遇到Perl解析机制的麻烦,因为它是一个解析引擎。

  • 比较AST的结构并产生明智的答案。你在这里可能会发现的是,有一些文献正在描述如何做到这一点(使用例如Levenshtein distance),但AST的细节很重要。 (Change distilling: Tree differencing for fine-grained source code change extraction最后,确定了距离后,你需要以一种可读的形式打印出这些增量。

然而,AFAIK,我的公司是唯一一个减少这种做法的公司。请参阅我们的Smart Differencer工具。 SmartDifferencers解析,构建AST,并根据通过一致的标识符替换移动,插入,删除,替换或修改的AST元素报告更改者。它们依赖于任何潜在的非常强大的GLR解析引擎,它最大限度地减少了接受新语法的问题。它们适用于许多常用语言,但目前不适用于ACPI。