2011-05-02 5 views
2

У меня есть куча файлов исходного текста ACPI, и я хочу рассчитать файловое сходство между ними. Я думал использовать что-то вроде Parse в Perl :: RecDescent , но я застрял на:разбор различных файлов одной и той же грамматики и вычисление файла для сходства файлов

1) Перевод ACPI Грамматика (www.acpi.info/DOWNLOADS/ACPIspec40a.pdf) к чему-то Разбор :: RecDescent поймет 2) Уметь метрику сравнивать 2 проанализированных файла

Любые идеи?

+0

Все, что вы хотите, это «подобие», а не фактические дельта? Почему бы просто не подсчитать количество линии, которые дают diff, дают полезный номер сходства? Может быть, вы хотите сравнить файлы с помощью своих синтаксических деревьев? –

+0

Да, я хочу сравнить их, используя их содержимое в соответствии с общим синтаксисом – 719016

+1

, кстати, если вы используете perl 5.10 или новее, я рекомендую использовать [Regexp :: Grammars] (http://search.cpan.org) /dist/Regexp-Grammars/lib/Regexp/Grammars.pm) вместо Parse :: RecDescent –

ответ

1

Так у вас есть две проблемы:

  • Разбор ACPI для построения AST. У этого есть обычные проблемы, гарантирующие, что у вас есть четко определенная грамматика, что ваш синтаксический анализатор может разбираться в соответствии с этой грамматикой (часто вам нужно сгибать хорошее определение грамматики, чтобы разрешить обработку машинного процесса для обработки), и построение соответствующего АСТ , У вас будут проблемы с Perl-машинами, просто потому, что это синтаксический анализатор.

  • Сравнение структуры АСТ и получение разумного ответа. То, что вы, скорее всего, найдете здесь, состоит в том, что есть литература, в которой подробно описывается, как это сделать (с использованием, например, Levenshtein distance), но что детали для АСТ имеют значение. (Change distilling: Tree differencing for fine-grained source code change extraction Наконец, определив расстояние, вам необходимо распечатать дельт в какой-читаемой форме.

Однако, AFAIK, моя компания является единственным, который уменьшил это на практике. Смотрите наш Smart Differencer инструмент. SmartDifferencers анализируют, строят АСТ и изменяют отчеты в терминах элементов АСТ, перемещенных, вставленных, удаленных, замененных или модифицированных последовательным подстановкой идентификаторов. Они зависят от любого основного сильного механизма синтаксического анализа, который сводит к минимуму проблемы принятия новых грамматик. работа для многих общих языков, но не в настоящее время для ACPI.

2
  1. Чтобы начать работу с Разбор :: RecDescent вы можете посмотреть на Pro Perl Parsing, Ch. 5 или на Advanced Perl Programming, Ch. 2
  2. Xml Diff инструменты должны соответствовать для сравнения иерархически структурированных данных; возможно, вы можете применить такой инструмент для НРХ, сохраненных в формате XML

 Смежные вопросы

  • Нет связанных вопросов^_^