2009-10-05 14 views
10

Estoy buscando una forma de analizar el código de C++ para recuperar algo de información básica sobre las clases. Realmente no necesito mucha información del código en sí, pero sí la necesito para manejar cosas como macros y plantillas. En resumen, quiero extraer la "estructura" del código, lo que mostrarías en un diagrama UML.Qué bibliotecas están disponibles para analizar C++ para extraer información de tipo

Para cada clase/struct/union/enum/typedef en la base de código, todo lo que necesita (después plantillas & macros se han manejado) es:

  • Su nombre
  • El espacio de nombres en el que se viven
  • Los campos que aparecen en (nombre del tipo, el nombre del campo y de las restricciones de acceso, tales como privada/mutable/etc)
  • funciones contenidas dentro (tipo de retorno, nombre, parámetros)
  • El declarando archivo
  • Línea/números de las columnas (o desplazamiento de bytes en el archivo) en la definición de estos datos comienza

Las instrucciones reales en el código son irrelevantes para mis propósitos.

Anticipo que muchas personas digan que debería usar una expresión regular para esto (o incluso Flex & Bison), pero estas no son realmente válidas, ya que necesito que el preprocesador y la plantilla funcionen correctamente.

+0

Incluso si expandió el preprocesador y las directivas de plantilla, la expresión regular no será lo suficientemente fuerte como para recopilar esta información de tipo correctamente. –

Respuesta

5

Suena como un trabajo para gcc-xml en combinación con la biblioteca C++ xml o el lenguaje de scripting xml-friendly de su elección.

+0

De la descripción en la página que vinculó, parece que es exactamente lo que necesitaré. –

+0

Genial, el faq también dice que las plantillas creadas son también registradas, esto suena perfecto (lo único que parece faltar son los "cuerpos funcionales", que es lo único que realmente no necesito en absoluto) –

+0

Es bueno escuchar, creo que es conveniente para casos más simples. –

4

Correr Doxygen en el código le daría la mayor parte de eso, ¿no?

¿En qué formato desea la salida?

+0

Por lo que he visto, Doxygen realmente solo puede generar datos amigables para el ser humano, el análisis puede llevar un poco más para un programa, solo lo necesito en un formato donde pueda acceder fácilmente a esa información a través del código. –

+0

Doxygen también puede generar XML: http://www.doxygen.nl/config.html#cfg_generate_xml –

0

Puede ampliar fácilmente las macros ejecutando el preprocesador (cpp) en la fuente. Las plantillas no son tan fáciles ya que la instanciación de plantillas ocurre mucho más tarde.

+0

Esta es una opción que tenía en mi mente, pero recientemente tuve algunos tratos con el preprocesador para 2 completamente los diferentes proveedores (un sony, el otro MS) y el resultado que dan es en realidad diferente de lo que se usa internamente (MS PUEDE ser solo un error de espacio en blanco, pero causa errores que impiden que se cree el archivo preprocesado. Todavía necesito algo para pasar el código. –

2

Exuberant Ctags le dará la mayor parte de lo que necesita, por lo general es utilizado por los editores para proporcionar navegación de código.
Puede ahogarse en algunas plantillas ...

0

Doxygen también puede producir un XML detallado configurando una opción en el archivo de configuración. Es bastante completo y muy fácil de usar. Desde el Doxygen home page:

La salida XML consiste en una estructura "volcado" de la información recogida por doxygen. Cada compuesto (class/namespace/file/...) tiene su propio archivo XML y también hay un archivo de índice llamado index.xml.

Un archivo de script llamado XSLT combine.xslt también se genera y se puede utilizar para combinar todos los archivos XML en un solo archivo .

Doxygen también genera dos esquemas XML archivos index.xsd (para el archivo de índice) y compuesto.xsd (para los archivos compuestos ). Este archivo de esquema describe los elementos posibles, sus atributos y cómo están estructurados, es decir, describe la gramática de los archivos XML y se puede usar para la validación o para dirigir scripts XSLT.

En el directorio de complemento/doxmlparser que puede encontrar una biblioteca analizador para leer la salida XML producido por doxygen en forma incremental (ver complemento/doxmlparser/include/doxmlintf.h para la interfaz de la biblioteca)

2

La DMS Software Reengineering Toolkit es una máquina de análisis y transformación de programas de propósito general. Su C++ Front End se basa en DMS para proporcionar un análisis completo de C++ para una variedad de dialectos comunes de C++, puede procesar conjuntos de clases de C++ simulatáneamente y construye información completa de nombre/tipo/acceso que puede usar de la forma que desee. La información se etiqueta como archivo/línea/columna de origen preciso. (Incluye un preprocesador completo).

Tienes razón; Regex ni siquiera puede acercarse a esto.

+0

Corrígeme si me equivoco: una solución a medio cocer no será útil; cualquiera puede analizarlo en resultados completos o incorrectos/faltantes, en cualquier proceso de extracción en el que uno envíe el código, es de esperar. – MaD70

+0

El significado del código es bastante frágil y depende crucialmente del significado de los símbolos del usuario. Los errores menores en la interpretación de este significado generalmente repercuten en los resultados de algunos operadores que no tienen sentido. Si no analizas detenidamente C++ con detalles insoportables, no puedes construir analizadores interesantes y mucho menos herramientas que puedan cambiar el código de manera confiable. –

+0

Gracias por compartir con nosotros su experiencia, Ira. – MaD70

4

Véase también Ira Baxter aquí, donde él cites his own product.

Advertencia: eso sí, solamente Elsa "..I oyen hace un trabajo bastante bueno .." en la construcción de una tabla de símbolos, que de acuerdo con Ira Baxter es necesario que la intención original de la OP (véanse los comentarios a esta respuesta - Lo cito porque es un experto en el campo).

+0

Continuando con el comentario, tenga en cuenta que el OP quería una forma simple de extraer algún tipo de información y generar algo de eso. Manejar eso con analizadores de C++ completos consume demasiado tiempo e innecesariamente, especialmente porque el costo del analizador -> xml -> C++ no se pagará en tiempo de ejecución. Aparte de eso, buena lista. –

+0

Subestima lo costoso que es computacionalmente analizar XML. Como señaló Ira Baxter (él es un experto en el tema) "* Tienes razón, la expresión regular ni siquiera puede acercarse a esto *" y quiere decir (Ira corrígeme si me equivoco) que una solución a medias no ser útil El análisis de C++ es notoriamente difícil y sin analizarlo por completo, espero resultados incorrectos o faltantes en cualquier proceso de extracción en el que envíe el código. – MaD70

+1

No solo tiene que analizar, sino que debe compilar la tabla de símbolos. Y esto es una perra; las reglas para esto ocupan la mayor parte del manual de referencia de 600 páginas. Analizadores de C++ basados ​​en ANTLR, OpenC++, Stratego, no hacen esto. La tesis de Willink es levemente interesante, pero no conozco a nadie que haya utilizado sus resultados con enojo. Elsa que escuché hace un buen trabajo. Creo que Clang dice que su analizador C++ está incompleto en este momento. GCC-XML hace un buen trabajo si todo lo que quiere es escribir datos y no le importan las toneladas de XML que produce. DMS hace esto y también produce información del cuerpo de la función. –

Cuestiones relacionadas