Lex (informática)

Lex (informática)

Lex es un programa para generar analizadores léxicos (en inglés scanners o lexers). Lex se utiliza comúnmente con el programa yacc que se utiliza para generar análisis sintáctico. Lex, escrito originalmente por Eric Schmidt y Mike Lesk, es el analizador léxico estándar en los sistemas Unix, y se incluye en el estándar de POSIX. Lex toma como entrada una especificación de analizador léxico y devuelve como salida el código fuente implementando el analizador léxico en C.

Aunque tradicionalmente se trata de software propietario, existen versiones libres de lex basadas en el código original de AT&T en sistemas como OpenSolaris y Plan 9 de los laboratorios Bell. Otra versión popular de software libre de lex es Flex.

Contenido

Estructura de un archivo de lex

La estructura de un archivo de lex es intencionadamente similar a la de un archivo del yacc; los archivos se dividen en tres secciones, separadas por líneas que contienen solamente dos símbolos "%", como sigue:

Sección de declaraciones
%%
Sección de reglas
%%
Sección de código en C

  • La sección de declaraciones 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. Este código en C debe ir entre los símbolos %{ %}.

      También se pueden incluir "atajos" para definir patrones de la Sección de Reglas, por ejemplo en vez del patrón [0-9]* (cero o más dígitos que reconocerían cualquier número natural), se puede definir en esta sección el "atajo":  números [0-9]*, así, en la sección de código pondríamos el patrón {números} {acción_en_C;}. Con esto se clarifica la escritura del código en lex.

  • La sección de reglas 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 asociable a un patrón dado, ejecuta el código asociado de C. Ésta es la base de del funcionamiento de lex.
  • La sección de código C contiene sentencias en C y funciones que serán copiadas en el archivo fuente generado. Estas sentencias contienen generalmente 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 enlazarlo en tiempo de compilación.

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.

/*** Sección de declaraciones ***/

%{
/* Código en C que será copiado */
#include <stdio.h>
%}

/* Esto indica a Flex que lea sólo un fichero de entrada */
%option noyywrap

%%
    /*** Sección de reglas ***/

    /* [0-9]+ identifica una cadena de uno o más dígitos */
[0-9]+  {
            /* yytext es una cadena que contiene el texto coincidente. */
            printf("Encontrado un entero: %s\n", yytext);
        }

.       {   /* Ignora todos los demás caracteres. */   }

%%
/*** Sección de código en C ***/

int main(void)
{
    /* Ejecuta el ''lexer'', y después termina. */
    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á:

Encontrado un entero: 123
Encontrado un entero: 2
Encontrado un entero: 6

Uso de Lex con Yacc

Lex y Yacc (un generador de analizadores sintácticos) suelen ser 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 de estados finitos 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 proporcionar a Yacc estos símbolos.

Véase también

  • Analizador léxico Flex
  • Yacc

Enlaces externos


Wikimedia foundation. 2010.

Игры ⚽ Нужна курсовая?

Mira otros diccionarios:

  • Lex electronica — (lex informatica)  это нормативная система, регламентирующая торговые операции, совершаемые в электронной (информационной) среде; продолжение lex mercatoria. Авторы концепции. Карим Бенихлеф (Karim Benyekhlef)[1]  профессор юридического …   Википедия

  • Categoría:Software para Unix — Esta categoría es un contenedor general, utilizado para organizar categorías más precisas. Por su naturaleza amplia, sólo deben aparecer en ella los artículos muy generales. Por favor, utiliza en lo posible alguna de las subcategorías. Nota: Se… …   Wikipedia Español

  • Parque Jurásico (película) — Para otros usos de este término, véase Parque Jurásico. Jurassic Park …   Wikipedia Español

  • Serie fílmica de Superman — Saltar a navegación, búsqueda La serie fílmica de Superman es la lista de todos los largometrajes del personaje ficticio del cómic Superman, producidos desde 1951 hasta la fecha. Consta de seis entregas y ha sido una de las más populares desde… …   Wikipedia Español

  • Anexo:Películas de Superman — Este artículo o sección necesita referencias que aparezcan en una publicación acreditada, como revistas especializadas, monografías, prensa diaria o páginas de Internet fidedignas. Puedes añadirlas así o avisar …   Wikipedia Español

  • Wikipedia:Contenido por wikiproyecto — Atajos WP:CPRWP:CPR WP:CPPRWP:CPPR WP:CPWWP:C …   Wikipedia Español

  • Ad hoc — Para los jueces de Tribunales o Cortes internacionales, ver Juez ad hoc . Ad hoc es una locución latina que significa literalmente «para esto». Generalmente se refiere a una solución elaborada específicamente para un problema o fin preciso y, por …   Wikipedia Español

  • Navaja de Ockham — La navaja de Ockham (a veces escrito Occam u Ockam), principio de economía o principio de parsimonia (lex parsimonia), es un principio metodológico y filosófico atribuido a Guillermo de Ockham (1280 1349), según el cual cuando dos teorías en… …   Wikipedia Español

  • Perl — Desarrollador(es) Larry Wall www.perl.org Información general Paradigma multiparadigma, funcional, im …   Wikipedia Español

  • Index (search engine) — Search engine indexing collects, parses, and stores data to facilitate fast and accurate information retrieval. Index design incorporates interdisciplinary concepts from linguistics, cognitive psychology, mathematics, informatics, physics, and… …   Wikipedia

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”