たくさんの ACPI ソース言語ファイルがあり、それらの間のファイル間の類似性を計算したいと考えています。Perl の Parse::RecDescent のようなものを使用することを考えましたが、行き詰まっています:
1) ACPI Grammar (www.acpi.info/DOWNLOADS/ACPIspec40a.pdf) を Parse::RecDescent が理解できるものに翻訳する 2) 解析された 2 つのファイルを比較するためのメトリックを用意する
何か案は?
たくさんの ACPI ソース言語ファイルがあり、それらの間のファイル間の類似性を計算したいと考えています。Perl の Parse::RecDescent のようなものを使用することを考えましたが、行き詰まっています:
1) ACPI Grammar (www.acpi.info/DOWNLOADS/ACPIspec40a.pdf) を Parse::RecDescent が理解できるものに翻訳する 2) 解析された 2 つのファイルを比較するためのメトリックを用意する
何か案は?
したがって、次の 2 つの問題があります。
ACPI を解析して AST を構築します。これには、適切に定義された文法があることを確認し、構文解析機構がその文法に従って構文解析できるようにするという通常の問題があります (構文解析機構がそれを処理できるようにするには、適切な文法定義を曲げる必要があります)。 . Perl が解析エンジンであるという理由だけで、Perl の解析機構でこれらの問題が発生します。
AST の構造を比較し、賢明な答えを導き出します。ここで見つける可能性が高いのは、これを行う方法を大まかに説明している文献がいくつかあることです (たとえば、レーベンシュタイン距離を使用) が、AST の詳細は重要です。(変更の抽出: きめ細かいソース コードの変更抽出のためのツリー差分参照 最後に、距離を決定したら、読み取り可能な形式でデルタを出力する必要があります。
ただし、私の知る限り、これを実践に移したのは私の会社だけです。Smart Differencerツールを参照してください。SmartDifferencer は、一貫した識別子の置換によって移動、挿入、削除、置換、または変更された AST 要素に関して、AST を解析、構築、およびチェンジャーを報告します。それらは、新しい文法を受け入れる問題を最小限に抑える、基礎となる非常に強力な GLR 解析エンジンに依存しています。それらは多くの一般的な言語で機能しますが、現在 ACPI では機能しません。