Как вы сравниваете два файла, содержащие C-код, основанный на структуре кода, а не просто текстовые различия? - PullRequest
8 голосов
/ 07 ноября 2010

У меня есть два файла с кодом C, которые я хочу сравнить. Я ищу утилиту, которая будет создавать синтаксическое дерево для каждого файла и сравнивать синтаксические деревья, а не просто сравнивать текст файлов. Таким образом, незначительные различия в форматировании и стиле будут игнорироваться. Было бы неплохо даже сказать инструменту сравнения игнорировать такие различия, как имена переменных и т. Д.

Поправь меня, если я ошибаюсь, но у diff нет этой возможности. Я пользователь Ubuntu. Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Наш SD Smart Differencer делает именно то, что вы хотите. Он использует парсеры качества компилятора для чтения исходного кода и построения AST для двух выбранных вами файлов. Затем он сравнивает деревья, руководствуясь синтаксисом, поэтому его не смущают пробелы, макет или комментарии. Поскольку он нормализует значения констант, его не смущает изменение основ или того, как вы выражали escape-последовательности!

Дельты сообщаются на уровне конструкций языка (переменная, выражение, оператор, объявление, функция, ...) с точки зрения намерения программиста (удаление, вставка, копирование, перемещение), завершенного определением того, что идентификатор имеет был последовательно переименован в измененном блоке.

У SmartDifferencer есть версии, доступные для C (на нескольких диалектах; если вы разбираете с точностью до компилятора, язык диалекта имеет значение), также как и для C ++, Java, C #, JavaScript, COBOL, Python и многих других языков. 1007 *

Если вы хотите понять, как набор файлов связан друг с другом, наш SD CloneDR примет очень большой набор файлов и расскажет, что у них общего. Он находит код, который был отредактирован копированием-вставкой во всем наборе. Вам не нужно указывать, что искать; он находит это автоматически. Используя AST (как выше), это не одурачено изменениями пробела или переименованием идентификаторов. На сайте есть несколько примеров отчетов об обнаружении клонов для разных языков.

2 голосов
/ 07 ноября 2010

Существует программа под названием codeCompare от devart (http://www.devart.com/codecompare/benefits.html#cc), которая включает следующую функцию (я знаю, что это не совсем то, что вы просили, но, вероятно, ее можно использовать для этого).

Эта функция называется «Сравнение структуры»

Эта функция позволяет сравнивать различные версии файла по наличию структурных блоков (классов, полей, методов). При этом разные версии одного и того же файласравнивается независимо от места назначения.

Сравнение структуры может применяться к следующим языкам:

  • C #
  • C ++
  • Visual Basic
  • JavaScript

(я знаю, что он не включает C, но, возможно, с помощью версии C ++ вы можете решить эту проблему)

...