Парсинг разных файлов одной и той же грамматики и вычисление файла для сходства файлов
У меня есть куча файлов с исходным языком ACPI, и я хочу вычислить сходство между ними. Я думал об использовании чего-то вроде Parse::RecDescent, но я застрял на:
1) Перевод грамматики ACPI (www.acpi.info/DOWNLOADS/ACPIspec40a.pdf) во что-то Parse::RecDescent поймет 2) Есть метрика для сравнения 2 проанализированных файлов
Есть идеи?
2 ответа
Итак, у вас есть две проблемы:
Разбор ACPI для построения AST. Обычно возникают проблемы с тем, чтобы у вас была четко определенная грамматика, чтобы ваш механизм синтаксического анализа мог анализировать в соответствии с этой грамматикой (часто вам нужно согнуть хорошее определение грамматики, чтобы механизм обработки разбирал ее для обработки), и создать соответствующий AST, У вас будут проблемы с парсинговым механизмом Perl, просто потому что это парсинговый движок.
Сравнение структуры AST и получение разумного ответа. Здесь вы, вероятно, найдете то, что есть некоторая литература, подробно описывающая, как это сделать (используя, например, расстояние Левенштейна), но что детали для AST имеют значение. ( Изменение дистилляции: древовидная разность для извлечения мелкозернистых изменений исходного кода. Наконец, определив расстояние, вы должны распечатать дельты в некоторой читаемой форме.
Однако, AFAIK, моя компания - единственная, которая сократила это на практике. Смотрите наш инструмент Smart Differencer. SmartDifferencers анализирует, создает AST и формирует отчеты с точки зрения элементов AST, перемещаемых, вставляемых, удаляемых, заменяемых или изменяемых путем подстановки согласованного идентификатора. Они зависят от любого лежащего в основе очень сильного механизма синтаксического анализа GLR, который сводит к минимуму проблемы принятия новых грамматик. Они работают для многих распространенных языков, но не в настоящее время для ACPI.
- Чтобы начать работу с Parse::RecDescent, вы можете взглянуть на Pro Perl Parsing, Ch. 5 или в Advanced Perl Programming, Ch. 2
- Инструменты Xml Diff должны подходить для сравнения иерархически структурированных данных; возможно, вы можете применить такой инструмент к AST, сохраненным в формате XML