tutorial instalar compiladores compilador c++ windows lex tokenize

c++ - compiladores - instalar flex y bison en ubuntu



¿Existe una herramienta mejor(más moderna) que lex/flex para generar un tokenizer para C++? (5)

Boost.Spirit.Qi (parser-tokenizer) o Boost.Spirit.Lex (solo tokenizer). Absolutamente amo Qi, y Lex tampoco es malo, pero solo tiendo a tomar Qi para mis necesidades de análisis ...

El único inconveniente real con Qi tiende a ser un aumento en el tiempo de compilación, y también se ejecuta un poco más lento que el código de análisis escrito a mano. Sin embargo, generalmente es mucho más rápido que analizar con expresiones regulares.

http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/index.html

Recientemente agregué el análisis de archivos de origen a una herramienta existente que generó archivos de salida a partir de complejos argumentos de línea de comandos.

Los argumentos de la línea de comando llegaron a ser tan complejos que comenzamos a permitir que se suministraran como un archivo que se analizó como si fuera una línea de comando muy grande, pero la sintaxis aún era incómoda. Así que agregué la capacidad de analizar un archivo fuente usando una sintaxis más razonable.

Utilicé flex 2.5.4 para Windows para generar el tokenizador para este formato de archivo fuente personalizado, y funcionó. Pero odiaba el código. las variables globales, la convención de nomenclatura extraña y el código c ++ que generó fueron terribles. El backend de generación de código existente estaba pegado a la salida de flex, no uso yacc ni bison.

Estoy a punto de volver a sumergirme en ese código, y me gustaría usar una herramienta mejor / más moderna. ¿Alguien sabe algo de eso?

  • Se ejecuta en el símbolo del sistema de Windows (la integración de Visual Studio está bien, pero yo uso los archivos make para compilar)
  • Genera un tokenizador de C ++ encapsulado adecuado. (No hay variables globales)
  • Utiliza expresiones regulares para describir las reglas de tokenización (compatible con la sintaxis de lex a plus)
  • No me obliga a usar el c-runtime (ni a falsificarlo) para leer archivos. (analizar de memoria)
  • Me advierte cuando mis reglas hacen que el tokenizador retroceda (o lo arregle automáticamente)
  • Me da control total sobre los nombres de variables y métodos (para que pueda cumplir con mi convención de nombres existente)
  • Me permite vincular varios analizadores en un único .exe sin colisiones de nombres
  • Puedo generar un analizador UNICODE (16bit UCS-2) si lo deseo
  • NO es un tokenizer + parser-generator integrado (quiero un reemplazo de lex, no un reemplazo de yxc de lex)

Probablemente podría vivir con una herramienta que acaba de generar las tablas de tokenización si eso fuera lo único disponible.


Flex también tiene una opción de salida de C ++.
El resultado es un conjunto de clases que hacen ese análisis.

Solo agrega lo siguiente al encabezado de tu archivo lex:

%option C++ %option yyclass="Lexer"

Entonces en tu fuente es:

std::fstream file("config"); Lexer lexer(&file) while(int token = lexer.yylex()) { }


Hay dos herramientas que le vienen a la mente, aunque tendría que descubrir por sí mismo cuál sería la adecuada, Antlr y GoldParser . Hay enlaces de idioma disponibles en ambas herramientas en los que se puede conectar al entorno de ejecución de C ++.


Ragel: http://www.complang.org/ragel/ Se ajusta a la mayoría de sus requisitos.

  • Se ejecuta en Windows
  • No declara las variables, por lo que puede colocarlas dentro de una clase o dentro de una función como desee.
  • Tiene buenas herramientas para analizar expresiones regulares para ver cuándo retrocederían. (No sé mucho sobre esto, ya que nunca uso la sintaxis en Ragel que crearía un analizador de seguimiento).
  • Los nombres de variables no se pueden cambiar.
  • Los nombres de las tablas tienen un prefijo con el nombre de la máquina y se declaran "const static", por lo que puede poner más de uno en el mismo archivo y tener más de uno con el mismo nombre en un solo programa (siempre que estén en diferentes archivos).
  • Puede declarar las variables como cualquier tipo de entero, incluido UChar (o el tipo de UTF-16 que prefiera). Sin embargo, no maneja automáticamente los pares sustitutos. Tampoco tiene clases de caracteres especiales para Unicode (creo).
  • Solo hace expresiones regulares ... no tiene características de bison / yacc.

El código que genera interfiere muy poco con un programa. El código también es increíblemente rápido, y la sintaxis de Ragel es más flexible y legible que cualquier otra cosa que haya visto. Es una pieza de software sólida como una roca. Puede generar un analizador controlado por tablas o un analizador controlado por goto.


boost.spirit y Yard parser vienen a mi mente. Tenga en cuenta que el enfoque de tener generadores lexer está algo sustituido por C ++ interno DSL (lenguaje específico del dominio) para especificar tokens. Simplemente porque es parte de su código sin usar una utilidad externa, simplemente siguiendo una serie de reglas para especificar su gramática.