Так у вас есть две проблемы:
Разбор ACPI для построения AST. У этого есть обычные проблемы, гарантирующие, что у вас есть четко определенная грамматика, что ваш синтаксический анализатор может разбираться в соответствии с этой грамматикой (часто вам нужно сгибать хорошее определение грамматики, чтобы разрешить обработку машинного процесса для обработки), и построение соответствующего АСТ , У вас будут проблемы с Perl-машинами, просто потому, что это синтаксический анализатор.
Сравнение структуры АСТ и получение разумного ответа. То, что вы, скорее всего, найдете здесь, состоит в том, что есть литература, в которой подробно описывается, как это сделать (с использованием, например, Levenshtein distance), но что детали для АСТ имеют значение. (Change distilling: Tree differencing for fine-grained source code change extraction Наконец, определив расстояние, вам необходимо распечатать дельт в какой-читаемой форме.
Однако, AFAIK, моя компания является единственным, который уменьшил это на практике. Смотрите наш Smart Differencer инструмент. SmartDifferencers анализируют, строят АСТ и изменяют отчеты в терминах элементов АСТ, перемещенных, вставленных, удаленных, замененных или модифицированных последовательным подстановкой идентификаторов. Они зависят от любого основного сильного механизма синтаксического анализа, который сводит к минимуму проблемы принятия новых грамматик. работа для многих общих языков, но не в настоящее время для ACPI.
Все, что вы хотите, это «подобие», а не фактические дельта? Почему бы просто не подсчитать количество линии, которые дают diff, дают полезный номер сходства? Может быть, вы хотите сравнить файлы с помощью своих синтаксических деревьев? –
Да, я хочу сравнить их, используя их содержимое в соответствии с общим синтаксисом – 719016
, кстати, если вы используете perl 5.10 или новее, я рекомендую использовать [Regexp :: Grammars] (http://search.cpan.org) /dist/Regexp-Grammars/lib/Regexp/Grammars.pm) вместо Parse :: RecDescent –