Buenas herramientas para crear un analizador / analizador C / C ++

¿Cuáles son algunas buenas herramientas para obtener un inicio rápido para analizar y analizar el código C / C ++?

En particular, estoy buscando herramientas de código abierto que manejen el preprocesador y el lenguaje C / C ++. Preferiblemente, estas herramientas usarían lex / yacc (o flex / bison) para la gramática, y no serían demasiado complicadas. Deben manejar las últimas definiciones ANSI C / C ++.

Esto es lo que he encontrado hasta ahora, pero no los he visto en detalle (¿pensamientos?):

  • CScope – Analizador C de la vieja escuela. No parece hacer un análisis completo, sin embargo. Descrito como un ‘grep’ glorificado para encontrar funciones de C.
  • GCC : el comstackdor de fuente abierta favorito de todos. Muy complicado, pero parece que lo hace todo. Hay un proyecto relacionado para crear extensiones GCC llamado GEM , pero no se ha actualizado desde GCC 4.1 (2006).
  • PUMA – El manipulador PUre. (desde la página: “La intención de este proyecto es proporcionar una biblioteca de clases para el análisis y la manipulación de fonts C / C ++. Para este fin, PUMA proporciona clases para escanear, analizar y, por supuesto, manipular fonts C / C ++.”) . Esto parece prometedor, pero no se ha actualizado desde 2001. Al parecer, PUMA se ha incorporado a AspectC ++ , pero incluso este proyecto no se ha actualizado desde 2006.
  • Varias gramáticas crudas C / C ++. Puede obtener c-c ++-grammars-1.2.tar.gz , pero esto no se ha mantenido desde 1997. Una pequeña búsqueda en Google obtiene otras gramáticas lex / yacc básicas que podrían servir como punto de partida.
  • ¿Cualquier otro?

Espero usar esto como punto de partida para traducir fonts C / C ++ a un nuevo lenguaje de juguetes.

¡Gracias! -Mate

(Agregado 2/9): Solo una aclaración: quiero extraer información semántica del preprocesador además del código C / C ++. No quiero que “#define foo 42” desaparezca en el entero “42”, sino que permanezca adjunto al nombre “foo”. Desafortunadamente, esto excluye varias soluciones que ejecutan el preprocesador primero y solo entregan el árbol de análisis C / C ++)

El análisis de C ++ es extremadamente difícil porque la gramática es indecidible. Para citar a Yossi Kreinin :

Gramática extraordinariamente complicada

“Excepcionalmente” debe interpretarse literalmente, porque todos los lenguajes populares tienen gramáticas libres de contexto (o “casi” sin contexto), mientras que C ++ tiene una gramática indecidible . Si le gustan los comstackdores y los analizadores sintácticos, probablemente sepa lo que esto significa. Si no te gusta este tipo de cosas, hay un ejemplo simple que muestra el problema con el análisis de C ++: es AA BB(CC); una definición de objeto o una statement de función? Resulta que la respuesta depende en gran medida del código antes de la statement: el “contexto”. Esto muestra (en un nivel intuitivo) que la gramática C ++ es bastante sensible al contexto.

Puede ver clang que usa llvm para analizar.

Soporte C ++ ahora mismo enlace

El generador de analizadores ANTLR tiene una gramática para C / C ++ así como también para el preprocesador. Nunca lo he usado, así que no puedo decir qué tan completo será su análisis de C ++. ANTLR en sí mismo ha sido una herramienta útil para mí en un par de ocasiones para analizar lenguajes mucho más simples.

Dependiendo de su problema, GCCXML podría ser su respuesta. Básicamente analiza la fuente usando GCC y luego le da XML fácilmente digestible del árbol de análisis sintáctico. Con GCCXML terminaste de una vez por todas.

pycparser es un analizador completo para C (C99) escrito en Python. Tiene un back-end AST completamente configurable, por lo que se usa como base para cualquier tipo de procesamiento de lenguaje que pueda necesitar.

Sin embargo, no es compatible con C ++. De acuerdo, es mucho más difícil que C.


Actualización (2012) : en este momento la respuesta, sin dudas, sería Clang : es modular, admite el C ++ completo (con muchas características C ++ – 11) y tiene una base de código relativamente amigable. También tiene una API C para enlaces a lenguajes de alto nivel (es decir, para Python ).

Eche un vistazo a cómo funciona Doxygen , el código fuente completo está disponible y está basado en flexiones.

Un candidato engañoso es GOLD, que es un conjunto de herramientas de analizador gratuito basado en Windows para la creación de traductores. Su lista de idiomas admitidos hace referencia a los idiomas en los que se pueden implementar analizadores sintácticos, no a la lista de gramáticas de parse compatibles.

Solo tienen gramáticas para C y C #, sin C ++.

El análisis de C ++ es un desafío muy complejo .

Está el marco de Boost / Spirit, y hace un par de años sí jugaron con la idea de implementar un analizador de C ++ , pero está lejos de ser completo .

El análisis completo y correcto de ISO C ++ está lejos de ser trivial, y de hecho hubo muchos esfuerzos relacionados. Pero es un trabajo inherentemente complejo que no se logra fácilmente, sin reescribir una interfaz de comstackción completa que comprenda todo C ++ y el preprocesador. Una implementación de pre-procesador llamada “wave” está disponible por parte de Spirit.

Dicho esto, es posible que desee echar un vistazo a pork / oink (basado en elsa), que es un conjunto de herramientas de analizador de C ++ diseñado específicamente para ser utilizado con fines de transformación de código fuente, que está siendo utilizado por el proyecto Mozilla para realizar proyectos a gran escala. análisis de código fuente estático y reescritura automática de código, la parte más interesante es que no solo es compatible con la mayoría de C ++, ¡sino también con el preprocesador mismo!

Por otro lado, hay una única solución patentada disponible: la interfaz EDG, que se puede utilizar para casi todos los esfuerzos relacionados con C ++.

Personalmente, verificaría la suite de cerdo / oink basada en elsa que se usa en Mozilla, aparte de eso, la FSF ahora ha aprobado el trabajo en los complementos de gcc usando la licencia de la biblioteca de tiempo de ejecución, así supongo que las cosas van a cambiar rápidamente, una vez que las personas pueden aprovechar fácilmente el analizador de C ++ basado en gcc para tales fines utilizando complementos binarios.

Entonces, en pocas palabras: si tienes dinero: EDG, si necesitas algo gratis / código abierto ahora : else / oink son bastante prometedores, si tienes algo de tiempo, quizás quieras usar gcc para tu proyecto.

Otra opción solo para el código C es cscout .

La gramática para C ++ es notoriamente peluda. Hay un buen hilo en Lambda al respecto, pero la esencia es que la gramática C ++ puede requerir arbitrariamente mucha anticipación.

Por el tipo de cosas que imagino que estarías haciendo, pensaría en hackear Gnu CC o Splint . Gnu CC, en particular, separa bastante la parte de generación de lenguaje, por lo que es mejor que construyas un nuevo back-end de g ++.

En realidad, PUMA y AspectC ++ aún se mantienen y actualizan activamente. Estaba buscando usar AspectC ++ y me preguntaba sobre la falta de actualizaciones. Envié un correo electrónico al autor que dijo que aún se están desarrollando AspectC ++ y PUMA. Puede obtener el código fuente a través de SVN https://svn.aspectc.org/repos/ o puede obtener comstackciones binarias regulares en http://akut.aspectc.org . Al igual que con muchos excelentes proyectos de c ++ en estos días, el autor no tiene tiempo para mantenerse al día con el mantenimiento de la página web. Tiene sentido si tienes un trabajo de tiempo completo y una vida.

Elsa vence a todo lo demás que sé de antemano para el análisis de C ++, a pesar de que no es 100% compatible. Soy un fan. Hay un módulo que imprime C ++, por lo que puede ser un buen punto de partida para su proyecto de juguete.

¿Qué tal algo más fácil de comprender, como C minúscula o C pequeña?

Vea nuestro Front End de C ++ para un analizador de C ++ completo: construye AST, tablas de símbolos, nombre y tipo de resolución. Incluso puede analizar y conservar las directivas del preprocesador. La interfaz de C ++ se basa en nuestro kit de herramientas de reingeniería de software DMS , que le permite utilizar esa información para llevar a cabo cambios arbitrarios en el código fuente mediante transformaciones fuente-fuente.

DMS es el motor ideal para implementar dicho traductor.

Habiendo dicho eso, no veo mucho sentido en su tarea imaginada; No veo mucho valor al tratar de reemplazar C ++, y encontrará que construir un traductor completo es una enorme cantidad de trabajo, especialmente si su objective es un lenguaje “de juguete”. Y es probable que tenga poco sentido analizar C ++ utilizando un analizador robusto, si su único propósito es producir una versión isomórfica de C ++ que sea más fácil de analizar (¡espera, ya postulamos un C ++ robusto!).

EDITAR Mayo de 2012: la interfaz de C ++ de DMS ahora maneja GCC3 / GCC4 / C ++ 11, Microsoft VisualC 2005/2010. Robustamente.

EDITAR Feb 2015: ahora maneja C ++ 14 en dialectos GCC y MS.

EDITAR Agosto de 2015: ahora analiza y captura las directivas de código y de preprocesador en un árbol unificado.

Hace un tiempo intenté escribir una herramienta que generará automáticamente pruebas unitarias para archivos c.

Para la pretratamiento, coloco los archivos en GCC. La salida es fea pero puede rastrear fácilmente en qué parte del código original del archivo preprocesado. Pero para sus necesidades, es posible que necesite algo más.

Usé Meter como base para un analizador C. Es de código abierto y usa lex y yacc. Esto hizo que fuera fácil ponerlo en funcionamiento en poco tiempo sin entender completamente lex y yacc.

También escribí una aplicación C ya que la solución lex & yacc no podía ayudarme a rastrear la funcionalidad en todas las funciones y analizar la estructura de toda la función en una sola pasada. Se volvió inmanejable en poco tiempo y fue abandonado.

¿Qué pasa con el uso de una herramienta como CFlow de GNU, que puede analizar el código y producir cuadros de gráficos de llamadas, esto es lo que el grupo abierto (página man) tiene que decir sobre cflow. La versión GNU de cflow viene con la fuente, y la fuente abierta también …

Espero que esto ayude, Saludos, Tom.