2011-02-02 8 views
12

Queremos analizar nuestro enorme árbol fuente C++ para obtener información suficiente para alimentar a otra herramienta para hacer diagramas de clases y relaciones de objetos, discernir la organización general de las cosas, etc.Cómo analizar fuentes C++ en Python?

Mi mejor intento hasta ahora es una secuencia de comandos Python que escanea todos los archivos .cpp y .h, ejecuta búsquedas de expresiones regulares para tratar de detectar declaraciones de clases, métodos, etc. No necesitamos un analizador completo para capturar cada detalle, o algún generador de diagramas UML pesados ​​- hay una gran cantidad de detalle que nos gustaría ignorar y estamos inventando nuevos tipos de diagramas. El script funciona sorta, pero por Dios es verdad: C++ es ¡difícil de analizar!

Entonces, ¿qué herramientas existen para extraer la información que queremos de nuestras fuentes? No soy un experto en idiomas, y no quiero algo con una curva de aprendizaje empinada. Algo que podemos usar los gruñidos de programadores de bajos recursos: P

Se prefiere Python como uno de los idiomas estándar aquí, pero no es esencial.

+6

C++ es notoriamente difícil de analizar, y por lo general necesita algunas herramientas bastante pesadas para hacerlo (analizadores GLR, por ejemplo). Me sorprendería mucho que hubiera una buena aproximación del análisis de C++ que no utilizara analizadores potentes. – templatetypedef

+0

¿Has analizado un compilador compilador estándar? Estos usan un lenguaje especial (algún tipo de formulario extendido de Backus-Naur, ¿recuerda la universidad?) Para describir el idioma de destino. –

+7

¿Consideró usar GCC-XML (http://www.gccxml.org) y luego python para el procesamiento del archivo XML resultante? – 6502

Respuesta

11

Simplemente recomendaré Clang.

Es un compilador basado en librerías de C++ diseñado con facilidad de reutilización en mente. En particular, significa que puede usarlo únicamente para analizar y generar un Árbol de sintaxis abstracta. Se encarga de toda la tediosa resolución de sobrecarga del operador, la creación de instancias de plantillas, etc.

Clang exporta una interfaz basada en C, que se amplía con enlaces de Python. La interfaz normalmente es bastante rica, pero no la he usado. De todos modos, las contribuciones son bienvenidas si desea ayudar a extenderla.

+0

No tenía idea de que CLang ya estaba en ese estado. Gracias por señalar eso! –

+0

Intenté con CLang para compilar todo, pero algunas lagunas oscuras en su análisis evitaron que la construcción fuera demasiado lejos. Pero vale la pena intentarlo de nuevo, ya que me gustan los mensajes de error que tienen sentido. Solo por analizar la fuente y no construirla, podría ser la mejor herramienta. – DarenW

+0

FWIW, el sitio web oficial Clang deletrea Clang con una letra minúscula L. –

6

Puede consultar GccXML y OpenC++, así como doxygen.

+0

OpenC++ es cada vez más difícil. –

+0

¿Qué significa "largo en el diente"? – tenfour

+0

@tenfour: largo en el diente === Viejo (Es porque los ancianos tienen dientes más largos y nudosos). –

0

he tenido buenas experiencias con PLY:

http://www.dabeaz.com/ply/

Pero esto requiere un poco de experiencia con lex y yacc

+3

Si desea un analizador de C++ completo, no desea construirlo usted mismo, a menos que quiera hacer una carrera de él. Créeme. –

+1

Eso no es lo que OP pidió.agarrar el AST de GCC es probablemente el mejor, pero el OP no parece querer un análisis completo –

+0

Si no usa un analizador completo, sus respuestas no serán precisas. Si no le importa si sus respuestas son precisas, tal vez un truco funcionará. Eso generalmente termina siendo bastante insatisfactorio al final. –

1

Por lo que dices de nuestras necesidades, la respuesta de GccXML de Tony será probablemente la mejor opción. Si eso no funciona, podría tratar de generar un esquema de su programa con cscope o ctags, y luego acceder a la información que desea desde su salida.

+0

Los ctags con la opción -x escriben información similar a lo que intento crear. Sin embargo, no está del todo bien. Tal vez se puede masajear en lo que necesito. – DarenW

3

¿Se puede ejecutar un paso de preproceso? Doxygen analiza la mayoría de la sintaxis de C++ y crea xml con todas las relaciones. Los compiladores también crean bases de datos de depuración (generalmente formato enano de gcc y formato de vista de código de MSC).

+0

Usamos doxygen, pero ¿eso significa que tengo que analizar XML para obtener lo que quiero? – DarenW

+0

@DarenW: python tiene una biblioteca xml, ¿no? Entonces, todo el trabajo arduo de análisis debe hacerse por usted, solo necesita usar el modelo de objetos para extraer los detalles que desee. –

1

Ha solicitado herramientas que puedan extraer información de C++.

Nuestra DMS Software Reengineering Toolkit es una tecnología de compilación configurable para construir analizadores personalizados. Tiene un completo C++ Front End con un preprocesador, análisis C++ completo con construcción AST (incluida la captura de comentarios) y una tabla de símbolos completa. Estos podrían usarse para extraer dicha información estructural y exportarla a lo que sea que desee para procesarla.

EDITAR: Uno de los comentarios es que solo hay 3 analizadores de C++ completos en el mundo. Sospecho más; seguramente IBM tiene uno que funciona. La interfaz de C++ de DMS se ha utilizado con enojo en aplicaciones grandes tanto en MS Visual Studio como en códigos fuente C++ de GNU, por lo que también podría calificar: -}

0

Si puede llevar a cabo este análisis usando Windows -aplicación de plataforma, ahórrese un montón de tiempo y problemas, y gaste $ 200 en Enterprise Architect por Sparx Systems (no tengo afiliación con esta compañía, solo un cliente satisfecho). (Nota: esto no se debe confundir con el paquete "Enterprise Architect" de Microsoft para Visual Studio.)

EA puede realizar ingeniería inversa en varios lenguajes, incluidos C++, C, Java y Python, generando algunos UML muy agradables diagramas de clase. (EA viene en una serie de paquetes diferentes, Desktop es el más barato pero debe hacerlo Professional, el segundo más barato, para obtener la función de ingeniería de código incluida.También me gusta la integración entre los diagramas de clases generados y la diagramación de secuencias, donde puede arrastrar una línea entre líneas de vida de objetos y se le presenta un menú de métodos definidos en función de la definición de clase del objeto de destino. En mi anterior negocio de consultoría, utilizamos esta herramienta bastante para desarrollar propuestas arquitectónicas de sistemas que luego incluimos como parte de nuestra oferta de proyecto (simplemente copie y pegue el diagrama en un documento de Word). No tardará mucho en recuperar sus $ 200.

+0

Algo que cuesta dinero y funciona en Windows no va a volar aquí, una colmena llena de físicos basados ​​en Linux. ¿Lo has usado principalmente para sistemas nuevos? ¿Es bueno obtener una comprensión de una gran base de código existente? – DarenW

+3

Es curioso cómo creemos que escribir una solución parcial en el transcurso de las semanas es mejor que gastar $ 200, por lo general, eso se considera un pensamiento de jefe de pelo puntiagudo. Sí, lo he usado para obtener una idea general de una base de códigos existente, solo la señala en el directorio que contiene el código, elige el idioma y las extensiones de archivo, y hace clic en "Ir". Claro, puede generar algunos diagramas bastante complicados, pero romperá los diagramas de acuerdo con su directorio y/o estructura de paquete, y puede simplificar los diagramas después del hecho. – PaulMcG

Cuestiones relacionadas