2011-05-13 5 views
5

Sto cercando un parser C++ che sia in grado di estrarre tutte le funzioni e i metodi con le sue firme. C'è qualcosa di simile?alla ricerca di parser di codice C++ per vedere tutte le firme

Ho dato un'occhiata a gccxml lì ho il problema, che non è in grado di utilizzare gli spazi dei nomi e non è soddisfacente quando è presente solo un file di intestazione.

+0

+1, tra l'altro per l'ultima due anni come parte del mio progetto parallelo, ho scritto un parser, che estrae firma metodo/funzione da 'classe, spazio dei nomi, classe interna 'ecc. Voglio renderlo commercializzato prima o poi. – iammilind

+0

@iammilind: mi concentro sul materializzare il denaro. Nessun risultato definitivo ancora – sehe

+0

@sehe, significa? hai anche scritto qualcosa del genere? Beh, quello di cui sto parlando non è solo un parser. È un progetto per il garbage collector automatico che include questa parte dell'estrazione di firme di puntatori, classi, spazi dei nomi, funzioni/metodi e così via. – iammilind

risposta

1

Il compilatore Clang ha ovviamente la funzionalità per farlo, se ricordo bene c'è persino un'API per accedere all'albero del codice generato dal parser.

+1

C'è. CLang genera un AST (Abstract Syntax Tree) del codice e fornisce una classe di base 'ConsumerAST' per visitarla. –

+0

Ho pensato piuttosto a libclang (http://llvm.org/devmtg/2010-11/Gregor-libclang.pdf) ma dovrebbe funzionare anche – Milan

+0

libclang è la C-API. Se si ha accesso a C++, si avranno più informazioni complete che si interfacciano direttamente poiché alcune funzionalità richiedono tempo per essere trasferite alla C-API. Per cose semplici come dichiarazioni, dovrebbe essere perfettamente adatto, anche se forse non è adatto poiché C-code richiede un certo sforzo. –

0

si potrebbe provare a compilare il codice con il flag save-temps impostato su gcc, questo rende gcc output i file con macro di spiegatura e firme complete. questi sono i file .ii.

opzioni
+0

produce quasi lo stesso risultato del file di intestazione, ma ho bisogno di un output analizzato che sia facile da estrarre per altri programmi. – develhevel

4

più evidente:

  1. ctags
  2. cscope

Solo un esempio della pagina GCC man:

-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 

Inoltre v'è un gccxml backend

1

È possibile utilizzare l'opzione -dump dello strumento abi-compliance-checker per analizzare le firme di funzioni e metodi dal file di intestazione (s):

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

XML descrittore (DESC.xml) è il seguente:

<version> 
    VERSION 
</version> 

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

Lo strumento funziona come segue:

  1. chiamate GCC con -fdump-translation-unit e un insieme di opzioni automatiche di -I... sulle intestazioni specificate nel descrittore XML di input;
  2. Analizzare il dump AST generato da GCC;
  3. Generare firme e definizioni di funzione nel formato Data::Dumper o XML (se è disponibile l'opzione -xml aggiuntiva).

La firma campione di int BZ2_bzRead (int *bzerror, BZFILE *b, void *buf, int len) funzione dal bzlib.h intestazione appare come:

 
'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' 
}, 
Problemi correlati