2011-05-02 76 views
2

我有一堆ACPI源語言文件,我想計算文件以歸檔它們之間的相似度。我想用類似Perl的解析:: RecDescent的 的,但我被困在:解析同一文法的不同文件並計算文件的相似度

1)翻譯的ACPI語法(www.acpi.info/DOWNLOADS/ACPIspec40a.pdf)的東西解析:: RecDescent的會理解 2)有一個度量來比較2解析文件

任何想法?

+0

所有你想要的是一個「相似性」而不是實際的增量?爲什麼不只是計算數量差異產生的行給出了一個有用的相似性數字?也許你想使用它們的語法樹比較文件? – 2011-05-03 14:10:11

+0

是的,我想根據通用語法 – 719016 2011-05-06 12:12:08

+1

使用它們的內容進行比較,如果您使用的是perl 5.10或更新版本,我會推薦使用[Regexp :: Grammars](http://search.cpan.org /dist/Regexp-Grammars/lib/Regexp/Grammars.pm)而不是Parse :: RecDescent – 2011-05-22 00:37:16

回答

1

所以,你有兩個問題:

  • 解析ACPI建立一個AST。這有一個常見的問題,那就是確保你有一個明確定義的語法,你的解析機制可以根據這個語法來解析(通常你必須彎曲一個好的語法定義來使解析機器能夠處理它),並且建立一個相應的AST 。你將會遇到Perl解析機制的麻煩,因爲它是一個解析引擎。

  • 比較AST的結構併產生明智的答案。你可能在這裏找到的是有一些文獻很好地描述瞭如何做到這一點(例如使用Levenshtein distance),但AST的細節很重要。 (Change distilling: Tree differencing for fine-grained source code change extraction最後,在確定的距離,你需要一些可讀的形式打印出來的增量。

然而,據我所知,我公司是國內唯一一傢俱有降低此練習。請參閱我們的Smart Differencer工具。 SmartDifferencers通過一致的標識符替換來解析,構建AST和報告轉換器的AST元素移動,插入,刪除,替換或修改,它們依賴於任何潛在的非常強大的GLR解析引擎,它們可以最大限度地減少接受新語法的問題。爲許多常用語言工作,但目前不用於ACPI。

相關問題