Как сравнить два файла, содержащих код C, на основе структуры кода, а не только текстовых различий?

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

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


person Corey Jeffco    schedule 07.11.2010    source источник
comment
Это домашнее задание обнаружение плагиата? Множество пакетов для этого, если это то, что вы ищете.   -  person Ben Jackson    schedule 07.11.2010
comment
Вы можете частично достичь этого, нормализовав формат ввода, а затем изменив его. Утилита indent отлично подходит для этого. Я не могу дать вам список вариантов, но он может поглощать пустые строки, стандартизировать формат скобок и интервалы и так далее. Имена переменных будут намного сложнее.   -  person Cascabel    schedule 07.11.2010
comment
Я полагаю, что его можно использовать для этой цели, но на самом деле я собираюсь использовать его для сравнения двух файлов, которые я написал. Не могли бы вы опубликовать названия любых знакомых вам утилит для обнаружения плагиата? Возможно, они могли бы мне помочь. Спасибо!   -  person Corey Jeffco    schedule 07.11.2010
comment
Это может помочь. drdobbs.com/   -  person Faheem    schedule 07.11.2010


Ответы (2)


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

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

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

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

person Ira Baxter    schedule 07.11.2010

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

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

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

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

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

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

person mariana soffer    schedule 07.11.2010