Поиск синтаксического анализатора кода C++ для просмотра всех подписей

Я ищу синтаксический анализатор C++, который может извлечь все функции и методы с его сигнатурами. Есть ли что-то подобное?

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

4 ответа

Решение

Компилятор Clang, очевидно, обладает функциональностью для этого, если я правильно помню, есть даже API для доступа к дереву кода, сгенерированному синтаксическим анализатором.

Наиболее очевидные варианты:

  1. Ctags
  2. Cscope

Просто образец справочной страницы GCC:

-fdump-noaddr -fdump-unnumbered -fdump-translation-unit[-n] -fdump-class-hierarchy[-n] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline
           -fdump-statistics -fdump-tree-all -fdump-tree-original[-n] -fdump-tree-optimized[-n] -fdump-tree-cfg -fdump-tree-vcg -fdump-tree-alias -fdump-tree-ch -fdump-tree-ssa[-n] -fdump-tree-pre[-n] -fdump-tree-ccp[-n] -fdump-tree-dce[-n]
           -fdump-tree-gimple[-raw] -fdump-tree-mudflap[-n] -fdump-tree-dom[-n] -fdump-tree-dse[-n] -fdump-tree-phiopt[-n] -fdump-tree-forwprop[-n] -fdump-tree-copyrename[-n] -fdump-tree-nrv -fdump-tree-vect -fdump-tree-sink -fdump-tree-sra[-n]
           -fdump-tree-fre[-n] -fdump-tree-vrp

Также есть gccxml бэкэнд

Вы можете использовать -dump опция инструмента http://lvc.github.io/abi-compliance-checker/ для анализа сигнатур функций и методов из ваших заголовочных файлов:

abi-compliance-checker -lib NAME -dump DESC.xml -headers-only -stdout > api.dump

XML-дескриптор (DESC.xml) является следующим:

<version>
    VERSION
</version>

<headers>
    /path(s)/to/headers/
</headers>

Инструмент работает следующим образом:

  1. Вызов GCC с -fdump-translation-unit и набор автоматически сгенерированных -I... параметры заголовков, указанные во входном XML-дескрипторе;
  2. Разобрать дамп AST, сгенерированный GCC;
  3. Генерация сигнатур функций и определений типов в формате Data::Dumper или XML (если требуется -xml опция предусмотрена).

Образец подписи int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len ) функция от bzlib.h Заголовок выглядит так:

'228' => {
   'Header' => 'bzlib.h',
   'Line' => '160',
   'Param' => {
                '0' => {
                         'algn' => '4',
                         'name' => 'bzerror',
                         'type' => '30'
                       },
                '1' => {
                         'algn' => '4',
                         'name' => 'b',
                         'type' => '16'
                       },
                '2' => {
                         'algn' => '4',
                         'name' => 'buf',
                         'type' => '68'
                       },
                '3' => {
                         'algn' => '4',
                         'name' => 'len',
                         'type' => '41'
                       }
              },
   'Return' => '41',
   'ShortName' => 'BZ2_bzRead'
 },

Вы можете попробовать скомпилировать свой код с save-temps флаг установлен на gcc, это заставляет gcc выводить файлы с развернутыми макросами и полными подписями. это файлы.ii.

Другие вопросы по тегам