FLEX
Historia
Flex es una alternativa de software libre a la lex. Se utiliza con frecuencia con el generador de analizadores sintácticos Bison. A diferencia de Bison, Flex no es parte del proyecto GNU. Flex fue escrito en C por Vern Paxson alrededor alr ededor de 1987. Él estaba traduciendo un generador Ratfor, el cual había sido dirigido por Jef Poskanzer. Existe un escáner léxico similar para C ++ es flex++, que se incluye como parte del paquete de flex.
Características
Flex es una herramienta para generar analizadores léxicos. Un analizador léxico es un programa que reconoce patrones léxicos en el texto. El programa flex lee los ficheros de entrada dados, o la entrada estándar si no se dan los nombres de archivo, para una descripción de un analizador a generar. La descripción es en forma de pares de expresiones regulares y código C, denominadas reglas. Flex genera como salida un fichero fuente C, lex.yy.c por defecto, lo que define una rutina yylex (). Este archivo puede ser compilado y vinculado con la biblioteca de tiempo de ejecución de la flexión para producir un ejecutable. Cuando se ejecuta el archivo ejecutable, este analiza su entrada para las ocurrencias de las expresiones regulares. Siempre que encuentra uno, ejecuta el código C correspondiente.
Ventajas
Ofrece dos maneras distintas de generar analizadores para usar con C++. Una de ellas es simplemente compilar un analizador generado por flex usando un compilador de C++ en lugar de un compilador de C. Se puede utilizar para generar un analizador como una clase de C++, utilizando la opción ‘ -+’
Una alternativa de software libre a la lex.
Desventajas
Algunos patrones de contexto posterior pueden no ser correctamente emparejados y generar mensajes de aviso ("contexto posterior peligroso"). Estos son patrones donde el final de la primera parte de la regla coincide con el comienzo de la segunda parte, como "zx * / xy *". Para algunas reglas de contexto posterior, partes que están hechas de longitud fija no se reconocen como tales, lo que lleva a la pérdida de rendimiento mencionada anteriormente. La combinación de contexto posterior con el especial '|' acción puede producir que el contexto posterior fijo se convirtió en el contexto posterior variable más caro. El uso de `unput () 'invalida yytext y yyleng, a menos que el`% array' se ha utilizado directiva o la opción `-l '. Concordancia de patrones de NUL es sustancialmente más lento que el de otros caracteres.
1
El ajuste dinámico del buffer de entrada es lento, ya que conlleva el re análisis de todo el texto hasta el momento por el (generalmente enorme) token actual. Debido al tanto de buffers de entrada y lecturas por adelantado, no puede entremezclar llamadas a rutinas, tales como, por ejemplo, `getchar () ', con flex reglas y esperar que funcione. Llame a `input () 'en su lugar. Las flex algoritmos internos necesitan documentación. Incompatibilidades con lex y POSIX.
Aplicaciones
Además de para construir compiladores e intérpretes, los analizadores léxicos se pueden emplear para muchos programas “convencionales”. Los ejemplos más claros son aquellos programas que
tienen algún tipo de entrada de texto donde hay un formato razonablemente libre en cuanto a espacios y comentarios. Un analizador léxico simplifica notablemente la interfaz y si se dispone de un generador automático, el problema se resuelve en pocas líneas de código.
Ejemplo
La estructura general es la siguiente: Sección de declaraciones %% Sección de reglas %% Sección de código en C int num_lineas = 0, núm_de_caracteres = 0; %% \ N ++ num_lineas; ++ núm_de_caracteres; . ++ núm_de_caracteres; %% main () { yylex (); printf ("# de líneas =% d, # de chars =% d \ n", num_lineas, núm_de_caracteres); }
Referencias
Paxson V. (1995). Flex, version 2.5 A fast scanner generator. Recuperado el 15 de febrero del 2015 de: http://dinosaur.compilertools.net/flex/index.html Universitat Jaume. (2008). Procesadores de lenguaje. Analizador léxico [PDF file]. Recuperado el 15 de febrero del 2015, de: http://ocw.uji.es/material/5195/raw
2