| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III Introducción 3.1 Token y Lexemas 3.2 Algoritmo de los dos Buffers 3.3 Expresiones regulares

3.4 Definición y ejemplos de AFN

3.5 Definición y ejemplos de AFD

3.6 Construcción de un AFN a partir de una expresión regular

3.7 Conversión de un AFN a AFD (Construcción de subconjuntos)

3.8 Lenguaje LEX

3.9 Escritura de Programas LEX

UNIDAD IV
UNIDAD V
UNIDAD VI
UNIDAD VII
UNIDAD VIII
UNIDAD IX
PROBLEMARIO
Bibliografía

3.8 Lenguaje LEX

> El lenguaje lex es un generador de programas diseñado para el proceso léxico de cadenas de caracteres de entrada, este programa acepta una especificación, orientada a resolver un problema de alto nivel para comparar literales de caracteres, y produce un programa C que reconoce expresiones regulares, estas expresiones las especifica el usuario por medio de las especificaciones fuente que se le dan al lex.

> El código lex reconoce estas expresiones en una cadena de entrada y divide esta entrada en cadenas de caracteres que coinciden con las expresiones. En los bordes entre las literales, se ejecutan las secciones de programas proporcionados por el usuario. El archivo lex asocia las expresiones regulares y los fragmentos de programas. Puesto que cada expresión aparece en la entrada del programa escrito por lex, se ejecuta el fragmento correspondiente.

> El usuario proporciona el código adicional necesario para completar estas funciones, incluyendo código escrito por otros generadores. El programa que reconoce las expresiones se genera en forma de fragmentos de programa C del usuario. El lex no es un lenguaje completo sino un generador que representa una cualidad de un nuevo lenguaje que se añade al leguaje de programación C.
> El lex convierte las expresiones y acciones del usuario (llamadas fuente) en un programa C llamado yylex. El programa yylex reconoce expresiones en un flujo (llamado entrada) y lleva a cabo las acciones especificadas para cada expresión a medida que se va detectando.

> Considere un programa para borrar de la entrada todos los espacios en blanco y todos los tabuladores de los extremos de las líneas, por ejemplo las siguientes líneas:

> %%
> [b\ t]+ $ ;

> Esto es todo lo que se requiere, ya que programa contiene un delimitador %% para marcar el principio de una instrucción. Esta instrucción contiene una expresión que coincide con una o más apariciones de los caracteres espacio en blanco o tabulador (escrito \t para que se vea con mayor claridad, de acuerdo con la convención del lenguaje C) justo antes del final de una línea. Los corchetes indican la clase del carácter compuesto de espacios en blanco y tabuladores; el + indica uno o más del carácter anterior; y el signo de pesos ($) indica el final de la línea. No se especifica ninguna acción, por lo tanto el programa generado por lex ignorará estos caracteres. Todo lo demás se copiará. Para cambiar cualquier cadena de caracteres en blanco o tabuladores que queden en un solo espacio en blanco, añada otra instrucción:

> %%
> [b\ t]+$ ;
> [b\ t] + printf (“ ”);

> Lex se puede usar sólo para transformaciones sencillas, o para análisis o estadísticas que se aplican a un nivel léxico. Lex también se puede usar con un generador reconocedor para llevar a cabo la fase de análisis léxico; es especialmente fácil hacer que el lex y el yacc funcionen juntos.

> Los programas en lex reconocen sólo expresiones regulares; yacc escribe reconocedores que aceptan una amplia clase de gramáticas de contexto libre, pero que requieren un analizador de nivel bajo para reconocer tokens de la entrada. Por lo tanto, a menudo es conveniente una combinación de lex y yacc.

> Cuando se usa como un preprocesador para un generador, lex se usa para dividir la entrada, y el generador de reconocimiento asigna una estructura a los caracteres resultantes. Los programas adicionales, escritos por otros generadores o a mano, se pueden añadir fácilmente a programas que han sido escritos en lex. Los usuarios de yacc se darán cuenta de que el nombre yylex es el que yacc da a su analizador léxico, de forma que el uso de este nombre por lex simplifica la interface.

> Lex genera un autómata finito partiendo de expresiones regulares del lenguaje fuente. El autómata es interpretado, en vez de compilado, para ahorrar espacio, el resultado es todavía un analizador rápido. En particular, el tiempo que utiliza un programa en lex para reconocer y dividir una cadena de entrada es proporcional a la longitud de la entrada. El número de órdenes en lex o la complejidad de las instrucciones no es importante para determinar la velocidad, a no ser que las instrucciones que incluyan contexto posterior requieran de una cantidad importante de exploración.

> Lo que aumenta con el número y complejidad de las instrucciones es el tamaño del autómata finito, y por lo tanto el tamaño del programa generado por lex. En el programa escrito por lex, los fragmentos del usuario representan acciones que se van a llevar a cabo a medida que se encuentra cada expresión y se colectan como casos de un intercambio. El intérprete del autómata dirige el flujo de control, en donde se le proporciona al usuario la oportunidad para insertar declaraciones o sentencias adicionales en la rutina que contiene las acciones, o para añadir subrutinas fuera de esta rutina de acción.

> Lex no está limitado a fuente que se puede interpretar sobre la base de un posible carácter, por ejemplo, si hay dos instrucciones una que busca ab y la otra que busca abcdefg, y la cadena de caracteres de entrada es abcdefh, lex reconocerá ab y dejará el puntero de entrada justo delante de cd. Tal precaución es más costosa que el proceso de lenguajes más sencillos.

Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello