Ответ 1
Звучит как работа для gcc-xml в сочетании с xml-библиотекой С++ или удобным для XML языком скриптов по вашему выбору.
Я ищу способ разобрать код С++ для получения базовой информации о классах. Мне действительно не нужна большая информация из самого кода, но мне нужно, чтобы он обрабатывал такие вещи, как макросы и шаблоны. Короче говоря, я хочу извлечь "структуру" кода, что вы увидите на диаграмме UML.
Для каждого класса /struct/union/enum/typedef в базе кода все, что мне нужно (после обработки шаблонов и макросов):
Фактические инструкции в коде не имеют значения для моих целей.
Я ожидаю, что многие люди скажут, что я должен просто использовать регулярное выражение для этого (или даже Flex и Bison), но они не очень эффективны, так как мне действительно нужны обработчики препроцессора и шаблона.
Звучит как работа для gcc-xml в сочетании с xml-библиотекой С++ или удобным для XML языком скриптов по вашему выбору.
Запуск Doxygen в коде даст вам большую часть этого, не так ли?
В каком формате вы хотите получить результат?
См. также Иру Бакстер, где он цитирует свой собственный продукт.
Предупреждение: заметьте, только Elsa ".. Я слышу неплохую работу..." при построении таблицы символов, которая, согласно Ира Бакстеру, необходима для первоначального намерения OP (см. комментарии на этот ответ - я цитирую его, потому что он эксперт в этой области).
Exuberant Ctags даст вам большую часть того, что вам нужно, обычно используется редакторами для обеспечения навигации по коду.
Может задушить на некоторых шаблонах, хотя...
DMS Software Reengineering Toolkit - это инструмент анализа и преобразования программ общего назначения. Его С++ Front End основывается на DMS для обеспечения полнофункционального синтаксического анализа С++ для множества распространенных диалектов С++, может обрабатывать множество классов С++ одновременно, и создает полную информацию о имени/типе/доступе, которую вы можете использовать любым способом. Информация помечена как для точного исходного файла/строки/столбца. (Он включает полный препроцессор).
Вы правы; regex даже не может приблизиться к этому.
Вы можете легко получить макросы, развернутые, просто запустив предварительный процессор (cpp) в источнике. Шаблоны не так просто, так как создание экземпляра происходит намного позже.
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 для интерфейса библиотеки)