2012-07-26 19 views
7

Estoy tratando de usar flex y bison en mi proyecto para generar un código de analizador para una estructura de archivos. El lenguaje de programación principal es C++ y el proyecto está en un diseño OO que se ejecuta principalmente en paralelo.Flex ++ Analizador de BisonC++

Escuché que los analizadores generados flex y son códigos C y no son reentrantes. Google, encontré flex++ y bisonc++. Lamentablemente, no hay un tutorial simple para comenzar. La mayoría de los ejemplos se basan en bison/flex. Algunas personas integraron de alguna manera los analizadores bison/flex en su código C++. Se supone que es "complicado" ...

La documentación de flex++ y bisonc++ no me ayuda y. Tutoriales y ejemplos, todos reciben entrada de stdin e imprimen algunos mensajes en stdout.

Necesito estas características en mi programa de análisis:

  1. analizador debe ser una clase de C++, que se define de manera normal (una cabecera y un archivo CPP)
  2. Analizador recibe datos a partir de un std::string o std::stringstream o un char* nulo-terminado

Me siento tan confundido. ¿Debo usar flex++/bisonc++ o flex/bison? ¿Y cómo hacerlo, satisfaciendo las condiciones anteriores?

Respuesta

3

Hay flex/bison, flex ++/bison ++ y flexC++/bisonC++. Creo que es mejor elegir uno de estos tres pares, en lugar de mezclar/combinar flex ++ y bisonC++. Aquí están las instrucciones para Flexc++ y Bisonc++.

Desde el sitio web FlexC++:

FlexC++, contrariamente a flexionarse y doblarse ++, genera código que se destinados expresamente para el uso de los programas en C++. El conocido programa flex (1) genera código fuente C y flex ++ (1) simplemente ofrece un shell similar a C++ alrededor de la función yylex generada por flex (1) y apenas apoya las ideas actuales sobre desarrollo de software C++ . Contrariamente a esto, flexC++ crea una clase C++ que ofrece una función de miembro predefinida que coincide con la entrada de lex contra expresiones regulares y posiblemente ejecutando el código C++ una vez que las expresiones regulares coinciden. El código generado por flexC++ es puro C++, lo que permite a sus usuarios aplicar todas las características ofrecidas por ese idioma.

Desde el sitio web BisonC++:

BisonC++ es un generador de analizadores sintácticos de propósito general que convierte una gramática Descripción para una LALR (1) gramática libre de contexto en una clase de C++ para analizar que la gramática . Una vez que sea competente con bisonC++, puede usar para desarrollar una amplia gama de analizadores de lenguaje, desde los utilizados en las calculadoras de escritorio simples hasta lenguajes de programación complejos. BisonC++ es altamente comparable al programa bison ++, escrito por Alain Coetmeur: todas las gramáticas bison ++ debidamente escritas deben ser convertibles a gramáticas bisonC++ después de muy poco o ningún cambio. Cualquiera que esté familiarizado con bison ++ o su precursor, bisonte, debe poder usar bisonC++ con problemas. Debe usar la programación en C++ en para usar BisonC++ o comprender este manual.

Así que flexC++/bisonC++ son más que simples envoltorios alrededor de las antiguas utilidades de flex/bison. Generan clases completas de C++ para ser utilizadas en el escaneo/análisis reentrante.

+0

¡Incluso no puedo compilar flexC++! Recién descargado el código fuente. ¡Sin makefile, no puedo hacer nada! –

+0

@ sorush-r hay un paquete de Linux: http://packages.debian.org/sid/flexc++ ¿Por qué necesitarías un archivo MAKE? Solo incluya los encabezados y la compilación desde su propio entorno. – TemplateRex

+1

No escuché sobre 'icmake' antes. parece ser el sistema de compilación utilizado para compilar 'flexC++'. Gracias –

2

Flex puede generar un escáner C reentrante. Vea la Sección 19 Reentrant C scanners en el manual de Flex.

De forma similar, Bison puede generar un analizador C de reentrada. Vea la Sección 3.8.11 A Pure (Reentrant) Parser en el manual de Bison para más detalles.

¿Es absolutamente necesario tener un analizador basado en C++ y std :: string/stringstream?

¿Has visto Boost.Spirit como alternativa?

+0

No. Puedo cambiar mi código para generar 'char *' s para analizar. Bu no puede leer la entrada de 'stdin' –

+1

@ sorush-r: Debería poder cambiar la fuente de su entrada de escáner Flex C mediante la redefinición de la macro' YY_INPUT() '. Consulte [Sección 9 El escáner generado] (http://flex.sourceforge.net/manual/Generated-Scanner.html#Generated-Scanner) en el manual de Flex. Echaré un vistazo serio a Boost.Spirit también. – Void