Подтвердить что ты не робот

Есть ли средство командной строки для извлечения typedef, structure, enumeration, variable, function из файла C или С++?

Я хочу, чтобы инструмент командной строки извлекал определение или объявление (typedef, structure, enumeration, variable или function) из исходного файла C или С++. Также был бы удобен способ заменить существующее определение/объявление (после преобразования извлеченного определения с помощью представленного пользователем script). Существует ли такой общий инструмент или есть какое-то резонансное приближение такого инструмента?

Скриптивность и способность подключаться к пользовательским скриптам или программам здесь важны, хотя я тоже академически интересуюсь программами GUI. Рекомендуются решения с открытым исходным кодом для лагеря Unix/Linux (хотя мне также интересны инструменты Windows и OS X). Первичные языковые интересы - это C и С++, но более общее решение будет еще лучше (я думаю, нам не нужны сверхточные возможности синтаксического анализа для поиска, извлечения и замены определения в исходном файле программы).

Примеры использования примеров (дополнительно - для любопытного ума):

  • Учитывая глубоко вложенные инициализации struct и переменные (массивы) этих типов, предположим, что необходимо изменить определение структуры путем добавления или переупорядочения полей или переопределения определений переменных/массивов в более читаемом формате без введения ошибок, возникающих в результате ручной труд. Это будет работать, извлекая старые инициализации, а затем используя script/program, чтобы записать новые инициализации для замены старых.
  • Для реализации инструмента просмотра кода - извлеките определение.
  • Генерация декоративного кода (например, запись/возврат в журнал).
  • Структурирование скриптового кода (например, извлечение этой и той вещи и размещение в другом месте без изменений - комментарий фиксации контроля версии может документировать команду для выполнения этой операции, чтобы сделать ее очевидной и проверяемой, что ничего не изменилось).

Альтернативная проблема: Если есть инструмент для определения местоположения определения (для начала и конца строки было бы достаточно - мы могли бы даже предположить, что все определения/декларации, которые нас интересуют, находятся в их собственных line), то это просто упражнение ловкости пальца, чтобы написать программу для

  • определения извлечения,
  • заменить определения или даже
  • извлеките определение, запустите программу, указанную параметрами командной строки (или редактором), в

    • получить требуемые извлеченные определения из stdin (или из временного файла),
    • выполнить преобразование (редактирование) и
    • выводить новые определения на stdout (или сохранять их в заданный временный файл)

    для замены исполняющей программой.

Таким образом, главная, более сложная задача - найти начальную и конечную строки определения.

Примечание о тегах: Более точный тег, чем code-generation, будет code-transformation, но он не существует.

4b9b3361

Ответ 1

Наш Инструмент DMS Software Reengineering Toolkit пытается стать инструментом, который вы хотите. Но это толкает современное состояние и не является инструментом стиля нирваны. Это достаточно хорошо, чтобы делать настоящую, интересную работу.

DMS предоставляет общие возможности для анализа, анализа и преобразования исходного кода.

Он использует явные грамматики для определения языков (таких как C и С++); грамматики управляют парсерами, которые строят абстрактные синтаксические деревья (АСТ). Различные примитивы анализа обеспечивают: а) средства [ "грамматики атрибутов" ATG] для сбора информации по древовидным путям информационных потоков, которые хорошо соответствуют форме AST, b) построение использования символа для карт определения символов [ "таблиц символов" ], c) контроль и анализ потока данных с использованием фактов, извлеченных ATG, d) анализ диапазона, e) анализ точек как локального, так и глобального. Эти примитивные анализаторы могут быть использованы для составления фактов из АСТ, чтобы сделать выводы о коде, представленном АСТ (например, "это утверждение изменяет эти переменные" ). A langauge front end объединяет грамматику и анализаторы, специфичные для языка, в многоразовом комплекте. DMS имеет такие языковые интерфейсы с разной степенью глубины и зрелости для самых разных языков.

[EDIT 6/27: передние концы C и С++ поддерживают определенные диалекты C и С++: ANSIC, C99, GCC3/4 C, MS Visual C, ANSI С++ 98, ANSI С++ 11, GCC3/4 С++, MS Visual С++ 2005/2008/2010. Если вам нужен точный анализ кода, вы должны использовать "правильный" диалект для обработки вашего кода.]

Но "анализ" не тот момент. Цель анализа - изменить ситуацию. DMS предоставляет дополнительную поддержку для процедурного изменения АСТ, для изменения АСТ посредством правил перезаписи источника-источника, написанных в поверхностном синтаксисе языка ( оба обусловлены каким-то выбранным результатом анализа) или группировать группы процедурных и исходных переписаний вместе, чтобы сделать сложные сложные перезаписи, которые могут переносить массовые изменения кода, такие как переструктурирование и т.д. После преобразования АСТ, они могут использоваться для регенерации ( "prettyprint" ) синтаксически корректного кода на соответствующем интерфейсе языка/диалекта. [Модифицируя АСТ для одного языка кусочно, пока у вас нет АСТ для другого, вы можете создавать переводчиков, но это не так просто, как это предложение подразумевает].

Это все работает в значительной степени, но все же несколько замешано в некоторых языковых осложнениях. Для C и С++ известным сложным является препроцессор; редактируя текст программы произвольно, условные обозначения препроцессора могут сделать исходный код невозможным для чего-либо, похожего на стандартную технологию синтаксического анализа. Передние концы DMS C и С++ немного улучшают эту ситуацию и могут анализировать код с хорошо структурированными директивами препроцессора, включая некоторые странные случаи, которые большинство людей не называли структурированными, но которые обычно встречаются:

   #IF  cond
        if (abc)  {
   #ELSE
        if (def)  {
   #ENDIF

Мы делаем интересный прогресс в анализе кода с произвольным размещением условных препроцессоров. Но как только вы это сделаете, теперь все ваши анализаторы внезапно вынуждены учитывать условные условия препроцессора, и мы все внезапно сталкиваемся с тем, что люди-компиляторы на самом деле не посетили.

DMS используется для создания крупных архитектурных сдвигов в больших программах на С++, конвертирования из стиля не CORBA в стиль CORBA с огромным количеством перетасовки кода, для извлечения кода по произвольным путям управления потоком для создания API-интерфейсов SOW-стиля для существующих C, чтобы вставить инструментарий в большие программы на C, чтобы обнаружить ошибки указателя и т.д. [Это было применено к другим задачам на многих других языках].

В нашем собственном опыте это довольно сложно использовать. По нашему мнению, это в том же смысле, что демократия является наихудшей из всех систем правления, за исключением всех остальных; YMMV. На веб-сайте имеется множество инструментов и дискуссий, основанных на DMS.

Фактически он использовался для извлечения функций (SOW-упражнение гораздо более общее, чем это) и вставки функций (это обобщенный случай инструментария).

Такие инструменты, как GCC-XML, являются тенями возможностей DMS. GCC-XML анализирует, строит таблицы символов и выдает декларации данных (а не код), но не может изменять какие-либо изменения кода. Кланг лучше; он анализирует C и С++ для АСТ, может анализировать промежуточное представление LLVM и имеет какой-то механизм для выплескивания к последующим исправлениям в исходный текст, вдохновленный желаемым изменением дерева. Я не знаю, может ли Clang выполнять массовые преобразования кода, особенно те, где один результат преобразования снова преобразуется (как вы модифицируете дерево для отложенного текстового патча?). DMS может делать это весь день и может делать это для многих языков, отличных от C и С++, и может делать это для произвольной смеси известных ему языков.

До тех пор, пока проблема препроцессора с условиями не будет решена, анализ/преобразование кода C и С++ будет непростым. Мы преуспеваем в этих задачах на этих языках только благодаря силе воли и используем самые сильные инструменты, которые мы можем построить. (Java не имеет этих проблем, и DMS соответственно лучше анализирует/преобразует его).

При серьезном риске высокомерия, я считаю, что DMS является лучшим инструментом для анализа и трансформации общего назначения. Как его архитектор, я рассматриваю его как свою долгосрочную работу, чтобы сделать его еще более сильным для этой задачи.

Ответ 2

Вы можете рассмотреть GCC-XML в качестве основы для разработки таких инструментов, как то, о чем вы говорите. Я использовал его в сочетании с pygccxml, чтобы выполнить автоматическое извлечение глубоко вложенных членов структуры. Это не сделает вашу работу легкой, но вы, конечно, будете лучше, чем в противном случае.

Я также слышал, как другие упоминали clang в качестве основы для написания таких инструментов, но не имели возможности много смотреть в него.

Ответ 3

Вы можете проверить Clang. Они имеют нетривиальные библиотеки обработки исходного кода.