Las buenas herramientas para la creación de un C / C ++ analizador / analizador [cerradas]

StackOverflow https://stackoverflow.com/questions/526797

  •  22-08-2019
  •  | 
  •  

Pregunta

¿Cuáles son algunas buenas herramientas para conseguir un inicio rápido para el análisis sintáctico y el análisis / C código C ++?

En particular, estoy en busca de herramientas de código abierto que manejan el / C ++ preprocesador y el lenguaje C. Preferiblemente, estas herramientas se usan lex / yacc (o flex / bison) para la gramática, y no ser demasiado complicado. Ellos deben manejar los últimos ANSI C / C ++ definiciones.

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

  • CSCOPE - Analizador de la vieja escuela C. No parece que hacer un análisis sintáctico completo, sin embargo. Descrito como un 'grep' glorificado para la búsqueda de funciones C.
  • GCC - compilador de código abierto favorito de todos. Muy complicado, pero parece que hacerlo todo. Hay un proyecto en este sentido la creación de extensiones del CCG llamados GEM , pero no tiene actualizado desde GCC 4.1 (2006).
  • PUMA - El manipulador puro. (De la página: "La intención de este proyecto es proporcionar una biblioteca de clases para el análisis y la manipulación de las fuentes de C / C ++. Para esto propósito PUMA proporciona clases para la exploración, el análisis y por supuesto la manipulación de C / C ++ fuentes. "). Esto parece prometedor, pero no se ha actualizado desde 2001. Al parecer, PUMA ha sido incorporado en AspectC ++ , pero incluso este proyecto no se ha actualizado desde 2006.
  • Varios C / C ++ gramáticas primas. Puede obtener C-C ++ - gramáticas-1.2.tar.gz , pero esto ha sido sin mantenimiento desde 1997. un poco de búsqueda Google se detiene en otras gramáticas lex básica / yacc que podrían servir como punto de partida.
  • Las demás?

Estoy esperando a utilizar esto como un punto de partida para la traducción de fuente en C / C ++ en un nuevo lenguaje de juguete.

Gracias! Mat

(Agregado 2/9): Sólo una aclaración: Quiero extraer información semántica del preprocesador además del código C / C ++ en sí. No quiero "# define foo 42" a desaparecer en el número entero "42", pero permanecen unidas al nombre "foo". Esto, lamentablemente, excluye varias soluciones que se ejecutan el preprocesador primer y único entregan el C / C ++ árbol de análisis sintáctico)

¿Fue útil?

Solución

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

  

Los mantienen la gramática complicada

     

"es increíblemente" debe interpretarse literalmente, porque todos los lenguajes populares libre de contexto (o "casi" libres de contexto) gramáticas, mientras que C ++ tiene undecidable gramática. Si te gusta los compiladores y programas de análisis, usted probablemente sabe lo que esto significa. Si usted no está en este tipo de cosas, hay una ejemplo sencillo que muestra el problema con el análisis de C ++: es AA BB(CC); definición de un objeto o una declaración de la función? Resulta que la respuesta depende en gran medida del código antes la declaración - el "contexto". Este muestra (en un nivel intuitivo) que la gramática el C ++ es bastante sensible al contexto.

Otros consejos

Usted puede mirar en sonido metálico que utiliza llvm para el análisis.

Soporte C ++ totalmente ahora enlace

El antlr generador de análisis tiene un gramática para C / C ++, así como el preprocesador. Nunca he usado, así que no puedo decir cómo completa su análisis de C ++ va a ser. antlr sí ha sido una herramienta útil para mí en un par de ocasiones para analizar los lenguajes mucho más simples.

En función de su problema GCCXML podría ser su respuesta. Básicamente se analiza el origen usando GCC y luego le da XML de fácil digestión del árbol de análisis sintáctico. Con GCCXML haya terminado de una vez por todas.

pycparser es un analizador completo para C (C99) escrito en Python. Tiene un motor de AST totalmente configurable, por lo que está siendo utilizado como base para cualquier tipo de procesamiento del lenguaje que pueda necesitar.

No es compatible con C ++, sin embargo. De acuerdo, es más más duro que el C.


Actualizar (2012) : en este momento la respuesta, sin lugar a dudas, sería Clang - es modular, apoya la plena C ++ (con muchas de C ++ - 11 funciones) y tiene una base de código relativamente simpático. También tiene una API C para los enlaces a los lenguajes de alto nivel (es decir, para Python ).

Tener un vistazo a cómo doxygen obras, el código fuente completo está disponible y es basado en flex.

Un candidato es engañosa ORO que es un conjunto de herramientas analizador libre basada en Windows de forma explícita para la creación de traductores . Su lista de apoyado idiomas se refiere a los idiomas en los que se puede poner en práctica programas de análisis, no la lista de las gramáticas de análisis sintáctico compatibles.

Sólo tienen gramáticas para C y C #, C ++ no.

de análisis de C ++ es un reto muy complejo .

Hay el marco Boost / Espíritu, y un par de años lo hicieron jugar con la idea de implementar un programa de análisis C ++, pero es lejos de ser completa .

análisis de forma completa y adecuada ISO C ++ está lejos de ser trivial, y había hecho muchos esfuerzos relacionados. Pero es un trabajo de por sí complejo que no se logra fácilmente, sin tener que reescribir un frontend compilador plena comprensión de todos C ++ y el preprocesador. Una implementación pre-procesador llamado "ola" está disponible de la gente espíritu.

Dicho esto, es posible que desee echar un vistazo a cerdo / oink (elsa-based), que es un C ++ toolkit analizador entiende específicamente para ser utilizado con fines de transformación de código fuente, que está siendo utilizado por el proyecto Mozilla hacer un análisis estático de código fuente a gran escala y el código automatizado reescribiendo, la parte más interesante es que no sólo es compatible con la mayor parte de C ++, sino también el preprocesador sí!

Por otra parte no hay de hecho una sola solución propietaria disponibles:. EDG la interfaz, que puede ser utilizado para casi todos los C ++ esfuerzos relacionados

En lo personal, me echa un vistazo a la suite de cerdo / oink basado D'elsa que se utiliza en Mozilla, aparte de eso, la FSF ha aprobado ahora el trabajo en