2011-05-13 13 views
5

Estoy buscando un analizador de C++ que pueda extraer todas las funciones y métodos con sus firmas. ¿Hay algo como esto?buscando analizador de código C++ para ver todas las firmas

Eché un vistazo a gccxml. Tengo el problema, que no puede usar espacios de nombres y no está bien cuando solo hay un archivo de encabezado.

+0

+1, por cierto para el pasado 2 de año como parte de mi proyecto paralelo, he escrito un programa de análisis, que extrae firma de método/función de 'clase, espacio de nombres, clase interna', etc. Quiero hacer que se comercialice en algún momento. – iammilind

+0

@iammilind: me enfoco en hacer que el dinero se materialice. No hay resultados definitivos todavía – sehe

+0

@sehe, ¿significa? ¿También has escrito algo así? Bueno, de lo que estoy hablando no es solo un analizador sintáctico. Es un proyecto para el recolector de basura automático que incluye esta parte de la extracción de firmas de punteros, clases, espacios de nombres, funciones/métodos, etc. – iammilind

Respuesta

1

El compilador de Clang obviamente tiene la funcionalidad para hacer esto, si no recuerdo mal, incluso hay una API para acceder al árbol de códigos generado por el analizador.

+1

Hay. CLang genera un AST (Árbol de sintaxis abstracta) del código y proporciona una clase base 'ConsumerAST' para visitarlo. –

+0

Pensé en libclang (http://llvm.org/devmtg/2010-11/Gregor-libclang.pdf) pero eso también debería funcionar – Milan

+0

libclang es la C-API. Si tiene acceso a C++, tendrá más información completa interactuando directamente, ya que algunas características tardan en transferirse a la C-API. Para cosas simples como declaraciones, debería ser perfectamente adecuado, aunque quizás no tan adecuado ya que el código C requiere un cierto esfuerzo. –

0

podría intentar compilar su código con el save-temps bandera establecida en gcc, esto hace que gcc muestre los archivos con despliegue macro y firmas completas. estos son los archivos .ii.

opciones
+0

esto hace casi el mismo resultado que en el archivo de encabezado, pero necesito un resultado analizado que sea fácil de extraer para otros programas – develhevel

4

más obvio:

  1. ctags
  2. cscope

sólo una muestra de la página del manual 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 

También hay un gccxml backend

1

Puede utilizar la opción -dump de la herramienta abi-compliance-checker para analizar las firmas de las funciones y los métodos de su archivo de cabecera (s):

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

XML-descriptor (DESC.xml) es la siguiente:

<version> 
    VERSION 
</version> 

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

La herramienta funciona de la siguiente manera:

  1. de llamadas GCC con -fdump-translation-unit y un conjunto de opciones generadas automáticamente -I... en los encabezados especificados en el descriptor XML de entrada;
  2. Analice el volcado de AST generado por GCC;
  3. Generar firmas de funciones y definiciones de tipos en el formato Data::Dumper o XML (si se proporciona una opción adicional -xml).

La firma muestra de int BZ2_bzRead (int *bzerror, BZFILE *b, void *buf, int len) función de bzlib.h cabecera parece:

 
'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' 
}, 
Cuestiones relacionadas