Herramienta de programación Lex
De Wikipedia, la enciclopedia libre
Lex es un programa que genera analizadores léxicos ("scanners" o "lexers"). Lex se utiliza comúnmente con el generador de análisis sintáctico yacc. Lex, escrito originalmente por Eric Schmidt yMike Lesk, es el analizador léxico estándar en los sistemas Unix, y se incluye en el estándar de POSIX. Lex lee un flujo de entradas que especifica el analizador léxico y hace salir el código fuente implementando el lexer en el Lenguaje de programación C.
Aunque tradicionalmente es propietario el software, versiones de Lex basadas en el código original de AT&T están disponibles como software libre, como parte del sistema tales como OpenSolaris y Plan 9 de los laboratorios Bell. Otra versión popular de software libre de Lex es Flex, que significa "fast lexical analyzer".
Tabla de contenidos |
[editar] Estructura de un archivo del lex
La estructura de un archivo del lex es intencionalmente similar a la de un archivo del yacc; los archivos se dividen en tres secciones, separadas por las líneas que contienen solamente dos signos de por ciento, como sigue:
Definition section %% Rules section %% C code section
- La definition section es el lugar para definir macros y para importar los archivos de cabecera escritos en C. También es posible escribir cualquier código de C aquí, que será copiado en el archivo fuente generado.
- La rules section es la sección más importante; asocia patrones a sentencias de C. Los patrones son simplemente expresiones regulares. Cuando el lexer encuentra un texto en la entrada que es similar a un patrón dado, ejecuta el código asociado de C. Ésta es la base de cómo funciona lex .
- La C code section contiene sentencias en C y funciones que serán copiadas en el archivo fuente generado. Estas sentencias contienen probablemente el código llamado por las reglas en la sección de las reglas. En programas grandes es más conveniente poner este código en un archivo separado y ligarlo adentro en el tiempo de compilación.
[editar] Ejemplo de archivo flex
Lo siguiente es un ejemplo de archivo lex para la versión flex de lex. Reconoce cadenas de números (números enteros) en la entrada, y simplemente los imprime en la salida.
/*** Definition section ***/ %{ /* C code to be copied verbatim */ #include <stdio.h> %} /* This tells flex to read only one input file */ %option noyywrap %% /*** Rules section ***/ /* [0-9]+ matches a string of one or more digits */ [0-9]+ { /* yytext is a string containing the matched text. */ printf("Saw an integer: %s\n", yytext); } . { /* Ignore all other characters. */ } %% /*** C Code section ***/ int main(void) { /* Call the lexer, then quit. */ yylex(); return 0; }
Si se da esta entrada a flex, será convertida en un archivo de C, lex.yy.c. Esto se puede compilar en un ejecutable que encuentre y haga salir cadenas de números enteros. Por ejemplo, dando la entrada:
abc123z.!&*2ghj6
el programa imprimirá:
Saw an integer: 123 Saw an integer: 2 Saw an integer: 6
[editar] Usar Lex con Yacc
Lex y Yacc (un generador de analizadores sintácticos) son comúnmente utilizados juntos. Yacc utiliza una gramática formal para analizar un flujo de entradas, algo que Lex no puede hacer con expresiones regulares simples (Lex se limita a los autómatas finitos de estado simples). Sin embargo, Yacc no puede leer en un flujo de entradas simple - requiere una serie de símbolos. Lex se utiliza a menudo para proveer a Yacc estos símbolos.