поиск синтаксического анализатора кода C ++ для просмотра всех подписей - PullRequest
5 голосов
/ 13 мая 2011

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

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

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

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

  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 бэкэнд

1 голос
/ 08 января 2012

Вы можете использовать опцию -dump инструмента 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'
 },
1 голос
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011

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

...