Diferencia entre revisiones de «Flex»
| Línea 43: | Línea 43: | ||
'''patrón acción''' | '''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. | 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==== | |
| + | {| width="800" cellspacing="1" cellpadding="1" border="1" | ||
| + | |- | ||
| + | | '''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 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 === | === 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'. | 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'. | ||
Revisión del 11:34 21 oct 2011
| ||||||||||||||||||||||
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.
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 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 ();
}
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
- Artículo Manual de Flex 2.5 Disponible en la Web "es.tldp.org" Consultado:20 de octubre del 2011
