2

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

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

有任何想法吗?

4

2 回答 2

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

所以你有两个问题:

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

  • 比较 AST 的结构并得出一个合理的答案。您可能会在这里找到一些文献大致描述了如何执行此操作(例如使用Levenshtein distance),但 AST 的细节很重要。(变化提取:细粒度源代码变化提取的树差分 最后,在确定了距离之后,您需要以某种可读的形式打印出增量。

但是,AFAIK,我的公司是唯一一家将这一点付诸实践的公司。请参阅我们的智能差异工具。SmartDifferencers 解析、构建 AST 并根据 AST 元素通过一致的标识符替换移动、插入、删除、替换或修改来报告更改器。它们依赖于任何底层非常强大的 GLR 解析引擎,该引擎可以最大限度地减少接受新语法的问题。它们适用于许多通用语言,但目前不适用于 ACPI。

于 2011-05-09T00:25:04.543 回答