2009-03-05 18 views
18

Estoy tratando de trabajar en un tipo de generador de código para ayudar a probar la unidad de un proyecto heredado C/C++ mezclado. No encuentro ningún tipo de herramienta independiente que pueda generar un código auxiliar a partir de la declaración. Entonces decido construir uno, no debería ser tan difícil.¿Dónde puedo encontrar la gramática BNF o YACC estándar para el lenguaje C++?

Por favor, cualquiera puede señalarme un enlace de gramática estándar, mejor descrito por el lenguaje yacc.

Espero no estar reinventando la rueda, por favor ayúdenme en ese caso.

Best Regards, Kevin

+0

Para generar el código de código auxiliar a partir de una declaración, primero debe analizar la declaración. Eso en la práctica significa un analizador completo de C++. Realmente no quieres hacer esto. –

Respuesta

2

Para otro enfoque, podría considerar el uso de piggy-backing en un compilador existente.

GCC-XML "compilará" C++ en archivos XML con una gran cantidad de información útil; puede ser suficiente para tus propósitos.

Desafortunadamente, GCC-XML se mantiene solo 1/4, y ponerlo a trabajar puede ser ... interesante. Buena suerte, si sigues esta ruta.

20

Desde el C++ FAQ Lite:

38.11 Is there a yacc-able C++ grammar?

La gramática yacc primaria que querrá es de Ed Willink. Ed cree que su gramática es totalmente compatible con the ISO/ANSI C++ standard, sin embargo, no lo garantiza: "la gramática tiene no", dice, "se ha usado con enojo". Puede obtener the grammar without action routines o the grammar with dummy action routines. Usted también puede obtener the corresponding lexer. Para aquellos que son interesado en cómo se logra un analizador libre de contexto (empujando todos las ambigüedades más un pequeño número de reparaciones que hacer más tarde después del análisis es completa), es posible que desee leer el capítulo 4 de his thesis.

También hay una gramática yacc muy antigua que no admite plantillas, excepciones, ni espacios de nombres; más se desvía del lenguaje central en algunas formas sutiles. Puede obtener gramática here o here.

+2

Si necesita analizar realmente C++, necesita maquinaria que realmente funcione. "No usado con ira" significa que no funciona para el código C++ real. (No entiendo por qué esta respuesta fue favorecida/subidas tantas veces dada la total ineficacia de esta respuesta). –

+1

@Ira: Mi suposición de por qué está votada es que realmente no hay nada mejor. El análisis de C++ es difícil. –

+1

Ira tiene razón. Es probable que acabes perdiendo el tiempo. Estoy dispuesto a construir el tuyo propio y sumergirme en el agujero del conejo, si lo que quieres hacer es aprender. Pero si desea hacer un trabajo, es aconsejable obtener algo que funcione de la caja. Las herramientas de DMS tienen otras ventajas, ya que cubren muchos idiomas y tiene funciones adicionales que pueden ser útiles en su proyecto. Si su tiempo vale dinero (es decir, no lo está haciendo por diversión), entonces los precios son razonables. –

1

Encontré this one recientemente. No lo he probado, así que no estoy seguro de si funciona. ¿Podría dar más información sobre la herramienta que está tratando de desarrollar? Descargué esta gramática porque estoy trabajando en una herramienta de instrumentación para poder agregar información de cobertura para mi unit test framework.

Después de volver a leer su comentario ...

Creo this tool ajuste exactamente a sus necesidades.

+0

De hecho, estoy trabajando en algo que en realidad pertenece a un marco de prueba de unidad. Para probar una sola unidad de traducción, se debe proporcionar una referencia externa para producir un binario ejecutable, por lo que estoy tratando de analizar el código fuente para encontrar declaraciones y generar una definición de stub. –

2

El enlace de Jared es lo más parecido a una gramática sin contexto que puede obtener. Ciertas cosas deben retrasarse para más adelante, pero eso es por algunos argumentos mejor que la gramática sensible al contexto de C++.

Para empeorar las cosas, C++ 1x complejizará la gramática de manera significativa. Para llegar a un análisis perfecto de C++, un analizador necesitará implementar una cantidad suficiente del estándar para realizar correctamente la resolución de sobrecarga, incluida la deducción del argumento de la plantilla, que a su vez requerirá el mecanismo de conceptos, lambdas, y en efecto casi todo el idioma, a excepción de las especificaciones de búsqueda y excepción de nombres en dos etapas que, si recuerdo bien, no necesitan una implementación real para analizar un programa con éxito.

En efecto, está a medio camino de un compilador si puede analizar C++.

+0

Si no puede hacer la resolución de nombres por completo, no está ni cerca de un compilador de C++. El análisis es mucho más fácil que la resolución de nombres. –

+1

No, porque el análisis requiere resolución de nombre; ese es mi punto. La gramática de C++ es tan mala. – coppro

+0

El análisis C++ NO requiere resolución de nombre si usa un analizador GLR.De hecho, es bastante fácil y lo hacemos con nuestra herramienta DMS todos los días (www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html). Si insiste en usar un analizador LALR (1) que no puede tolerar la ambigüedad local, * entonces * tiene que resolver el nombre como lo analiza y estoy de acuerdo que es un desastre, pero hay una razón para no hacerlo de esa manera. Hacer la resolución de nombres para C++ incluso con ambigüedades locales sigue siendo bastante difícil, lo concederé, pero no tan desagradable como cuando enredado con el analizador. –

1

Nuestro kit de herramientas de reingeniería de software DMS se puede obtener con un completo analizador de C++ robusto, . Ver http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Esto construye AST y tablas de símbolos, y puede inferir el tipo de cualquier expresión. DMS permite llevar a cabo análisis y transformaciones arbitrarios en el código C++.

Una transformación "simple" está instrumentando el código para recopilar datos de cobertura de prueba ; ofrecemos esto como una herramienta COTS. Ver este documento para entender cómo DMS hace: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDITAR de septiembre de 2013 (esta pregunta cada vez un poco rancio): análisis de flujo de C++ analizador/resolución de nombres/de control de DMS maneja completa C++ 11, en el Variantes ISO, GNU y Microsoft. También analizará (y conservará) el código fuente que contiene la mayoría de los condicionales del preprocesador. Tiene una gramática explícita que dirige el proceso de análisis, a diferencia de GCC o Clang.

+0

Si bien stackoverflow no favorece o desfavorece directamente las soluciones de código abierto y/o gratuitas, en general, es una mala idea poner un enlace enrevesado que no apunte directamente a una solución. Si realmente desea promocionar su herramienta, al menos apunte a una página que tenga algún código de ejemplo y dependencias que pueda usar sin tener que leer los enlaces publicitarios corporativos ni los enlaces de descarga amurallados. –

+0

OP dijo que quería una gramática, pero que su verdadero problema es analizar C++ para extraer información para generar stubs. Mi respuesta muestra cómo resolver su problema real omitiendo su idea poco práctica de obtener una gramática funcional (prácticamente no existen para los generadores de analizadores convencionales) y luego realizar el análisis de alguna manera sin resolver el problema de resolución de nombres (que es una gran cantidad de trabajo). Este "enlace intrincado" apunta directamente a una respuesta que es práctica. –

+0

No necesita fantasear con una opinión si cree que una pregunta no es práctica. Permita que alguien más calificado para la pregunta responda o deje que la pregunta quede sin respuesta y se demuestre que es correcta. En segundo lugar, visité esa página y no pude ver ninguna respuesta, sino una propaganda de marketing sobre una interfaz que no tenía ningún ejemplo ni enlace de descarga. Si hay una respuesta real, edite la respuesta y agréguela aquí en caso de que el sitio se caiga. –

4

he encontrado recientemente algunos archivos de gramática para C++ (C++ 1998: ISO/IEC 14882: 1998 y C++ 2008: ISO/IEC SC22/WG21 N2723 = 08-0233) en el grammarware website. Las gramáticas están representadas en Enahnced BNF, DMS BNF, BGF, SDF y Rascal notación. Sin embargo, es una lástima que las gramáticas C++ no parezcan actualizarse (no C++ 2003 o C++ 11).

Cuestiones relacionadas