Flex
|
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.
Sumario
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 C, denominadas reglas.La salida de Flex es un fichero en 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 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 carácter 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.
Sección 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 %{ #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 (); }
Opciones
Flex brinda un conjunto de opciones que facilitan su uso, las más utilizadas. Opción Descripción -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. -+ Especifica que quiere que Flex genere un analizador como una clase de C++ -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.
Fuente
- Artículo Manual de Flex 2.5 Disponible en la Web "es.tldp.org" Consultado:20 de octubre del 2011