Какие библиотеки доступны для разбора c ++ для извлечения информации о типах - PullRequest
11 голосов
/ 05 октября 2009

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

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

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

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

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

Ответы [ 7 ]

5 голосов
/ 05 октября 2009

Звучит как работа для gcc-xml в сочетании с x ++-библиотекой c ++ или xml-дружественным языком сценариев на ваш выбор.

4 голосов
/ 21 октября 2009

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

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

4 голосов
/ 05 октября 2009

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

В каком формате вы хотите вывод?

2 голосов
/ 08 октября 2009

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

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

2 голосов
/ 05 октября 2009

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

0 голосов
/ 06 октября 2009

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

Вывод XML состоит из структурированная «свалка» информации собранный кислородом. Каждое соединение (класс / пространство имен / файл / ...) имеет свой собственный XML-файл и есть также индекс файл с именем index.xml.

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

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

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

0 голосов
/ 05 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...