Flex

Flex
Información sobre la plantilla
Parte de la familia Yacc
Flex.png
Generador de Analizadores Léxicos
Modelo de desarrolloSoftware Libre
Lanzamiento inicial1987
Versiones2.5.33, 2.5.34, 2.5.35
Última versión estable2.5.4
Sistemas Operativos compatiblesWindow,Linux
IdiomaInglés
LicenciaGPL
Sitio web
http://flex.sourceforge.net/

Flex. Es un generador de analizadores léxicos, una herramienta creada para generar escáneres. Desarrollado por Vern Paxson a partir de la versión original de Jef Poskanzer con la ayuda de Van Jacobson. En la actualidad está integrada a la herramienta Bison para en conjunto ser utilizados en la construcción de potentes compiladores.

Funcionamiento

Flex recibe un fichero de entrada o varios con extensión .l, con la descripción del escáner que se desea generar.La descripción se encuentra en forma de parejas de expresiones regulares y código en Lenguaje de Programación C, denominadas reglas.La salida de Flex es un fichero en Lenguaje de Programación C cuyo nombre por defecto es `lex.yy.c' en el que se define una rutina `yylex ()',el mismo se compila y enlaza con la librería “-lfl” para producir un ejecutable, que al ser ejecutado analizará la entrada en busca de casos de las expresiones regulares y ejecutará el código en Lenguaje de Programación C correspondiente.

Formato del fichero de entrada de Flex

El fichero de entrada de Flex, es un archivo de extensión .l, o .ll si se trabaja en C++, el mismo está compuesto por tres secciones, separadas por una línea donde aparece únicamente un símbolo‘%%' en esta:

Definiciones 
%%
Reglas
%%
Código de usuario

Sección de definiciones

La sección de definiciones contiene declaraciones de definiciones de nombres sencillos para simplificar la especificación del escáner, y declaraciones de condiciones de arranque.Las definiciones de nombre tienen la forma:

nombre definición

El nombre será una palabra que comience con una letra o un guión bajo y puede contener letras y dígitos. La definición comienza en el primer caracter que sigue al nombre siempre que este no sea un espacio en blanco y continúa a todo lo largo de la línea.

Sección de Reglas

La sección de reglas en la entrada de Flex contiene una serie de reglas de la forma:

patrón acción

Donde el patrón debe estar sin sangrar y la acción debe comenzar en la misma línea. Los patrones en la entrada se escriben utilizando un conjunto extendido de expresiones regulares.

Expresiones Regulares

Caracter Descripción
. Reconoce todos los caracteres excepto el cambio de línea
\n Cambio de línea
* Se repite el caracter cero o muchas veces
+ Se repite el caracter una o muchas veces
? Se repite el caracter cero o una vez
^ Define el inicio de una expresión
$ Define el final de la expresión
"" Define una cadena, dentro se tienen que escapar los caracteres especiales del Lenguaje de Programación C para que se puedan reconocer, ejemplo: \n \t ..
[ ] Agrupa un rango de caracteres de los cuales se puede seleccionar uno solo en cada momento.
( ) Agrupa expresiones regulares.
{ } Expande los tokens o reconoce determinada cadena que se repitan según el rango que se especifique entre las llaves

Sección de Código de Usuario

Esta sección se utiliza para rutinas de complemento que llaman al escáner o son llamadas por este. La presencia de esta sección es opcional; si se omite, el segundo %% en el fichero de entrada se podría omitir también. Esta sección se copia literalmente a `lex.yy.c'.

Un ejemplo del código de un fichero de entrada de Flex
%{
#include <stdlib.h>
%}
DIGITO    [0-9]                          /*Reconoce dígitos*/
NUMEROD   [-+]? {DIGITO}+\. {DIGITO}+    /*Reconoce números reales*/
NUMEROE   [-+]? {DIGITO}+                /*Reconoce números enteros*/
%%
{NUMEROE}          {yylval.d_type=atof (yytext); return (NUMEROD) ;} 
{NUMEROE}          {yylval.d_type=atof (yytext); return (NUMEROE) ;} 
%%
Main
{
  yylex ();
}

¿Cómo Flex empareja la entrada?

Cuando el escáner generado está funcionando, este analiza la entrada buscando cadenas que concuerden con cualquiera de sus patrones. Si encuentra más de un emparejamiento, toma el que empareje más texto, si encuentra dos o más emparejamientos de la misma longitud, escoge la regla listada en primer lugar en el fichero de entrada de Flex. Entonces, la acción correspondiente al patrón emparejado se ejecuta y la entrada restante se analiza para otro emparejamiento.

Interfaz con Bison

Uno de los usos principales de Flex es como compañero del generador de analizadores sintácticos Bison. Los analizadores de Bison esperan invocar a una rutina llamada “yylex ()” para encontrar el próximo token de entrada. La rutina se supone que devuelve el tipo del próximo token además de poner cualquier valor asociado en la variable global yylval. Para usar Flex con Bison, uno especifica la opción “-d” de Bison para instruirle a que genere el fichero `y.tab.h' que contiene las definiciones de todos los “%tokens” que aparecen en la entrada de Bison. Entonces este archivo se incluye en el analizador de Flex.

Acciones

Cada patrón en una regla tiene una acción asociada, que puede ser cualquier sentencia en Lenguaje de Programación C. El patrón analiza en el primer caracter de espacio en blanco que no sea una secuencia de escape; lo que queda de la línea es su acción. Si la acción está vacía, entonces cuando el patrón se empareje el token de entrada simplemente se descarta. Si la acción contiene un “{”, entonces la acción abarca hasta que se encuentre el correspondiente ”}”, y la acción podría entonces cruzar varias líneas. Flex es capaz de reconocer las cadenas y comentarios de Lenguaje de Programación C.

Opciones

Flex brinda un conjunto de opciones que facilitan su uso, las más utilizadas.

  • -Pprefijo Cambia el prefijo ‘yy' usado por defecto por Flex para todas las variables visibles globalmente y nombres de funciones para que sea el nuevo prefijo.
  • -v Especifica que Flex debería escribir en stderr un sumario de estadísticas respecto al analizador que genera.
  • -p Genera un informe de rendimiento en stderr.
  • -+ Especifica que quiere que Flex genere un analizador como una clase de C++.

Fuente

  1. Artículo Manual de Flex 2.5 Disponible en la Web "es.tldp.org" Consultado: 20 de octubre del 2011.
  2. Página del manual de flex en Debian-Linux Squeeze.