¿Dónde puedo encontrar la gramática estándar de BNF o YACC para el lenguaje C ++?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de trabajar en un tipo de generador de código para ayudar a realizar pruebas unitarias de un proyecto mixto C / C ++. No encuentro que ningún tipo de herramienta independiente pueda generar código de código auxiliar a partir de la declaración. Así que decido construir uno, no debería ser tan difícil.

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

Espero no reinventar la rueda, por favor, ayúdame en ese caso.

Saludos cordiales, Kevin

¿Fue útil?

Solución

De la C ++ FAQ Lite :

38.11 ¿Hay una gramática C ++ capaz de usar yacc?

  

La gramática primaria de yacc que querrás   es de Ed Willink. Ed cree que su   la gramática es totalmente compatible con the   ISO / ANSI C ++ estándar , sin embargo él   no lo garantiza: "la gramática tiene   no '' él dice, "ha sido usado con ira".   Puede obtener la gramática sin   rutinas de acción o la gramática   con rutinas de acción ficticias . Tú   También puede obtener el correspondiente   lexer . Para quienes son   interesado en cómo logra un   analizador sin contexto (presionando todos   las ambigüedades más un pequeño número de   las reparaciones se realizarán después de analizar   está completo), es posible que desee leer   Capítulo 4 de su tesis .

     

También hay una gramática de yacc muy antigua   que no admite plantillas,   excepciones, ni espacios de nombres; además de eso   se desvía del lenguaje central en   Algunas formas sutiles. Puedes conseguir eso   gramática aquí o aquí .

Otros consejos

Recientemente encontré 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 sitio web de grammarware . Las gramáticas están representadas en notación BNH habilitado, DMS BNF, BGF, SDF y Rascal . Sin embargo, es una pena que las gramáticas de C ++ no parezcan actualizarse (no C ++ 2003 o C ++ 11).

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

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

En efecto, estás a mitad de camino de un compilador si puedes analizar C ++.

Para otro enfoque, podría considerar el respaldo en un compilador existente.

GCC-XML compilará " C ++ en archivos XML con mucha información útil; puede ser suficiente para sus propósitos.

Desafortunadamente, GCC-XML solo tiene mantenimiento de 1/4, y hacer que funcione puede ser ... interesante. Buena suerte, si sigues esta ruta.

Encontré éste 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 prueba de unidad marco .

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

Creo que esta herramienta se ajusta exactamente a sus necesidades.

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

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

EDITAR septiembre de 2013 (esta respuesta se estaba poniendo un poco obsoleta): C ++ de DMS analizador / resolución de nombres / análisis de flujo de control maneja C ++ 11 completo, En las variantes ISO, GNU y Microsoft. También analizará (y retendrá) Código fuente que contiene la mayoría de los condicionales del preprocesador. Tiene una gramática explícita. impulsando el proceso de análisis, a diferencia de GCC o Clang.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top