Какие библиотеки доступны для синтаксического анализа С++ для извлечения информации о типе

Я ищу способ разобрать код С++ для получения базовой информации о классах. Мне действительно не нужна большая информация из самого кода, но мне нужно, чтобы он обрабатывал такие вещи, как макросы и шаблоны. Короче говоря, я хочу извлечь "структуру" кода, что вы увидите на диаграмме UML.

Для каждого класса /struct/union/enum/typedef в базе кода все, что мне нужно (после обработки шаблонов и макросов):

  • Их имя
  • Пространство имен, в котором они живут
  • Поля, содержащиеся внутри (имя типа, имя поля и ограничения доступа, такие как private/mutable/etc)
  • Функции, содержащиеся внутри (тип возврата, имя, параметры)
  • Объявляющий файл
  • Номера строк/столбцов (или смещение байта в файле), где начинается определение этих данных

Фактические инструкции в коде не имеют значения для моих целей.

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

Ответ 1

Звучит как работа для gcc-xml в сочетании с xml-библиотекой С++ или удобным для XML языком скриптов по вашему выбору.

Ответ 2

Запуск Doxygen в коде даст вам большую часть этого, не так ли?

В каком формате вы хотите получить результат?

Ответ 3

См. также Иру Бакстер, где он цитирует свой собственный продукт.

Предупреждение: заметьте, только Elsa ".. Я слышу неплохую работу..." при построении таблицы символов, которая, согласно Ира Бакстеру, необходима для первоначального намерения OP (см. комментарии на этот ответ - я цитирую его, потому что он эксперт в этой области).

Ответ 4

Exuberant Ctags даст вам большую часть того, что вам нужно, обычно используется редакторами для обеспечения навигации по коду.
Может задушить на некоторых шаблонах, хотя...

Ответ 5

DMS Software Reengineering Toolkit - это инструмент анализа и преобразования программ общего назначения. Его С++ Front End основывается на DMS для обеспечения полнофункционального синтаксического анализа С++ для множества распространенных диалектов С++, может обрабатывать множество классов С++ одновременно, и создает полную информацию о имени/типе/доступе, которую вы можете использовать любым способом. Информация помечена как для точного исходного файла/строки/столбца. (Он включает полный препроцессор).

Вы правы; regex даже не может приблизиться к этому.

Ответ 6

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

Ответ 7

Doxygen также может создать подробный XML, установив параметр в файле конфигурации. Он достаточно тщательный и очень прост в использовании. Из Домашняя страница Doxygen:

Выход XML состоит из структурированный "сброс" информации собранный doxygen. Каждое соединение (класс/пространство имен/файл/...) имеет свои собственные XML файл, а также индекс файл index.xml.

Файл с именем comb.xslt XSLT scriptтакже генерируется и может использоваться для объединить все XML файлы в один файл.

Doxygen также генерирует две XML-схемы файлы index.xsd(для индексного файла) и соединение .xsd(для соединения файлы). Этот файл схемы описывает возможные элементы, их атрибуты и как они структурированы, т.е. описывает грамматику XML файлов и может использоваться для проверки или для управления сценариями XSLT.

В каталоге addon/doxmlparser вы может найти библиотеку синтаксического анализа для чтения выход XML, созданный doxygen в инкрементный способ (см. аддон/doxmlparser/включить/doxmlintf.h для интерфейса библиотеки)