инструменты сравнения синтаксиса?

Существуют ли какие-либо (в идеале с графическим интерфейсом) инструменты сравнения, которые знают о синтаксисе?

В качестве примера того, что я ищу, я продолжаю обнаруживать, что мой текущий инструмент мисс выравнивает повторяющийся код:

Foo  = { 'hello': 'world',    |  Foo  = { 'hello': 'world',
         'goodnight': 'moon'  |           'goodnight': 'moon'  
       }                      <
                              <
Bar  = { 'picture': 1000,     <
       }                      |         }

Мне нужен инструмент, который пытался бы совместить совпадающие скобки с одной стороны с соответствующими скобками с другой.


Изменить: я ищу инструмент, который может автоматически определять это условие и исправлять его выравнивание.


person BCS    schedule 10.08.2010    source источник
comment
исправить? Вы имеете в виду правильно определить скобки или как-то изменить исходный код?   -  person Ira Baxter    schedule 11.08.2010
comment
@Ira: Я ищу первую.   -  person BCS    schedule 11.08.2010
comment
Судя по обсуждению в других ответах, BCS, по-видимому, хочет либо исправить BeyondCompare, либо должен быть инструмент различия синтаксиса на основе графического интерфейса.   -  person Ira Baxter    schedule 11.08.2010
comment
@Ira, мне нужен инструмент сравнения text, который использует синтаксис в качестве подсказок, а не инструмент сравнения синтаксиса, который представляет свои результаты в виде сравнения текста.   -  person BCS    schedule 11.08.2010


Ответы (5)


Не основанный на графическом интерфейсе, а полностью управляемый синтаксисом: инструменты моей компании Smart Differencer для многих языков (включая Java, C#, C++, PHP, Python, JavaScript, HTML, XML, COBOL,...)

Smart Differencer разбирает исходный текст так же, как и компилятор, поэтому он понимает синтаксис языка и структурирует так, как это делает компилятор. Он сравнивает эти структуры (с использованием AST), чтобы определить «наименьшее расстояние редактирования» с точки зрения действий редактирования (перемещение, копирование, удаление, замена, переименование-идентификатор-в-блоке) в этих структурах и сообщает о них.

В вашем примере он будет знать, что фигурная скобка справа принадлежит foo, а не bar, и сообщит вам, что весь оператор, включающий bar, был просто удален.

Стиль вывода похож на diff, если вы хотите передать результат другому инструменту, или более удобочитаемый, если вы хотите изучить его напрямую.

person Ira Baxter    schedule 10.08.2010
comment
Звучит очень аккуратно, но оба переборщили и не совсем в правильном направлении. - person BCS; 10.08.2010
comment
@BCS: Не знаю насчет излишеств. Если вы не усвоите языковые структуры, вы не сможете их сопоставить; Я не знаю никаких альтернатив, которые могли бы приблизиться, если только вы не хотите просто совпадения скобок. Что не правильное направление? - person Ira Baxter; 11.08.2010
comment
@Ira: сопоставление скобок и (аналогичные правила подсказки выравнивания) - это все, что я хочу (я думаю, осведомленность о синтаксисе немного сильна для того, что я ищу), и мне нужен текстовый diff, только тот, который лучше справляется с выяснить, что нового по сравнению со старым. - person BCS; 11.08.2010
comment
@BCS: я озадачен. Если вы действительно хотите лучше идентифицировать новое и старое, вам действительно нужно сравнение на основе синтаксиса, потому что оно дает описания с точки зрения того, что понимают программисты (рецензенты?) . Вы удалили утверждение, включающее бар, кажется довольно описательным изменением, которое вы продемонстрировали. - person Ira Baxter; 11.08.2010
comment
Я хочу, чтобы строка 127 стала строкой 134 в достаточно независимой от языка форме. Учитывая, что это будет управлять графическим интерфейсом, а не сбрасывать текст, в любом случае нужно будет вмешивать в него что-либо еще со всеми требуемыми эвристиками устранения неоднозначности. - person BCS; 11.08.2010
comment
@BCS: Посмотрите примеры, представленные на веб-сайте. Для перемещения он создает различия с подробной информацией о строке и столбце L: C, которые я обозначу здесь P, Q, R, S. Для удаления он говорит, что диапазон P-Q удален; за ход вы получаете Moveed из диапазона P-Q в диапазон R-S. Вы можете игнорировать данные столбца, если хотите, и т. д. Есть выход, который может управлять графическим интерфейсом; см. пример графического интерфейса COBOL для SmartDifferencer. - person Ira Baxter; 11.08.2010
comment
Проблема в том, что у меня уже есть что-то (вне сравнения), близкое к тому, что я хочу, но чего-то не хватает. Хотя программа, которую вы упомянули, кажется, может что-то сделать, в ней также отсутствуют некоторые вещи (графический интерфейс и т. д.), которые мне нужны, и (и это важный момент) в ней есть куча вещей, которые меня не волнуют. . Я мог бы жить с некоторыми недостатками или излишками, но не с тем и другим одновременно. - person BCS; 11.08.2010

Beyond Compare позволит вам выровнять несоответствующие строки. Обычно мне везет с правильным сопоставлением строк.

person JYelton    schedule 10.08.2010
comment
Я использую БК и ищу что-то автоматическое. - person BCS; 10.08.2010


Мне нравится DiffMerge от Source Gear.

person Nick    schedule 10.08.2010
comment
Согласен, я тоже им пользуюсь, отличный инструмент. - person Barlow Tucker; 10.08.2010
comment
Я не вижу в документах никаких указаний на то, что я ищу. Он может определять совпадающие элементы, но, похоже, не позволяет им вкладываться друг в друга и не говорит, что использует их в качестве подсказок выравнивания. - person BCS; 10.08.2010

Инструмент Pretty Diff автоматически учитывает синтаксис. Процесс, который он использует, заключается в минимизации кода, чтобы удалить комментарии, а затем в улучшении кода, чтобы нормализовать форматирование и пробелы. Однако он поддерживает только несколько языков веб-клиента. Этот инструмент работает на стороне клиента, поэтому вы можете протестировать его в своем браузере, и есть пример страницы, содержащий несколько демонстраций.

person austincheney    schedule 06.07.2012