INDICE

MANUAL DE LEX

                 OPCIONES DE LLAMADA PARA EL LEX

DEFINICIONES

REGLAS

REGLAS AMBIGUAS

ACCIONES

ACCIONES POR DEFECTO

ACCIONES ; Y |

ACCIONES ESPECIALES

CONDICIONES START CONDICIONES START EXCLUSIVAS VARIABLES LEX

                El formato general de un programa escrito en LEX es: { definiciones }
%%

{ Reglas}

%%
{ Rutinas de usuario }
El mínimo programa LEX es:
%% ® su acción es la de copiar el fichero de entrada en uno de salida
 
 

Opciones de llamada para el Lex.

Para ejecutar el lex hay que introducir desde la línea de comandos:

flex [opciones] [-Sflex.skl] fichero_descripcion

Las opciones son: 

-b Genera información de retroceso en 'lex.backup'
-d Hace que el analizador generado se ejecute en modo de depuración
-r Genera dos ficheros de salida, y_code.c que contiene el código y y_tab.c que contiene la tabla de análisis
-f Especifica un analizador rápido, sin compresión de tablas y evita el uso de stdio.
-h Genera un sumario de ayuda de las opciones de flex por stdout
-i Indica a flex que genere un analizador case-insensitive, se ignorara si las letras en los patrones de entrada de flex son en mayúsculas o en minúsculas.
-s Hace que la regla por defecto se suprima. Si el analizador encuentra entrada que no es reconocida por ninguna de sus reglas, este aborta con un error. 
-t Indica a flex que escriba el analizador que genera a la salida estándar
-w Suprime los mensajes de aviso
-T Hace que flex se ejecute en modo de traza
-8 Ordena a flex que genere un analizador de 8-bits, reconoce caracteres de 8-bits


Definiciones
Pueden contener:
de forma opcional, código C, con el siguiente formato

% {

Código C

% }

EJEMPLO

¿Cómo se definirian las letras?¿Y los numeros?


 
 
Reglas

Esta parte de la especificación LEX contiene los patrones que representan todos los símbolos a reconocer por el autómata, así como las acciones a realizar cuando son identificados.

El formato de las reglas es:

Patrón(expresión regular) Acción;

Operadores:

* Repetición de 0 o más veces del carácter que le antecede

+ Repetición de 1 o más veces del carácter que le antecede

? Opcionalidad. El carácter anterior puede o no aparecer

() Agrupar

| Alternación. O aparecen los caracteres que hay a su izquierda o los de la derecha

" " los caracteres entre comillas son tomados como texto
\ el carácter que le sigue es tomado como texto y se utiliza para representar caracteres especiales

\n nueva línea

\t tabulador

\\ el carácter ‘\’

\b espacio en blanco

[ ] Uno de los caracteres que aparece entre []. En su interior el significado de los operadores es ignorado excepto \ - ^
  Rango. Si se desea incluir – dentro del conjunto de caracteres debe ser el primero o último dentro de []
. Cualquier carácter menos nueva línea

{d} Macro. Expande la definición d

x {n,m} x repetido de n a m veces

^x Cualquier carácter menos x

x$ una x al final de la línea

x/y una x pero sólo si va seguida de una y
 
 

EJEMPLOS
 

¿Cómo se representaria cualquier carácter menos una letra minuscula?

¿Cómo se representaria una de las letras minusculas y el -?
Qué cadenas podria generar esta regla: (ab|cd+)?(ef)*

 
 
Reglas ambiguas

El LEX permite especificaciones ambiguas, es decir, especificaciones donde 2 o más patrones se pueden corresponder con una misma secuencia de caracteres. En este caso la actuación del analizador de léxico será:

Elige la secuencia de caracteres más larga que corresponde con un patrón

A igualdad de caracteres opta por el primer patrón
 

  REJECT: significa ir a la siguiente alternativa (patrón) y reexplorar el texto de entrada

EJEMPLO 1

Escribe un programa que cuente las palabras el independientes y los el que forman la palabra ella, utilizando la accion reject; y otro programa sin usan esta accion.

 
 
Acciones

El formato de las acciones es:

<Acción ::= <Acción_simple | "{" <Acción_compuesta"}"

<Accion_simple::= ; | <Accion_especial; | Sentencia C; | "|"

<Accion_compuesta ::= <Accion_simple {<Acción_simple}
 
 

Acciones por defecto Para los caracteres reconocidos no realiza ninguna acción

Para los caracteres no reconocidos del fichero de entrada la acción es copiarlos en el fichero de salida
 
 

Acciones ; y |

; Representa la acción por defecto para los caracteres reconocidos

| Indica que la acción asociada al patrón es la misma que la del siguiente patrón

Acciones especiales

ECHO copia la secuencia de caracteres reconocida en el fichero de salida

REJECT se usa para las reglas ambiguas

BEGIN es útil cuando deseamos tener construcciones sensibles al contexto por la izquierda

  EJEMPLO 1
Cree un programa que al introducirle una cadena muestre todos los caracteres de dicha cadena salvo las letras minusculas.

EJEMPLO 2
Cree un programa que al introducirle una cadena copie la secuencia de caracteres (letras minusculas) reconocidos en el fichero de salida.

EJEMPLO 3

Cree un programa que cuente el numero de palabras, caracteres y lineas en un fichero.


 
Condiciones Start (Sensibilidad al contexto izquierdo)

Permiten activar o desactivar patrones dependiendo del entorno en el que se encuentren. Formato:
Para definir los nombres de las condiciones, situaremos en la parte de las definiciones:

        %START nombre_condicion_1 ... nombre_condicion_N La activación de una condición se realizará con la ejecución de la acción: BEGIN (nombre_condicion),

La desactivación de las condiciones se realizará con la ejecución de BEGIN 0

En las reglas se hará referencia a una condición de la siguiente forma: <nombre_condicion Patron

EJEMPLO  
Crea un programa que al introducir una cadena que comience con la letra a escriba primera, si dicha cadena comienza con b escriba segunda y si comienza por c escriba tercera.

 
Condiciones Start exclusivas

En ellas cuando se activa una condición se desactivan todos los patrones que no comiencen por <nombre_condición

El formato sólo difiere de las anteriores en la definición, donde se usará:

%X nombre_condicion_1 .... nombre_condición_N
 

EJEMPLO
Crea un programa que al introducir una cadena que comience con la letra a escriba primera, si dicha cadena comienza con b escriba segunda y si comienza por c escriba tercera.


 
 

Variables relevantes LEX

 
Char *yytext  Variable que contiene el lexema reconocido. Termina con \0
int yyleng Número de caracteres reconocidos 
int yylineno Línea actual del fichero de entrada
FILE *yyin Fichero de entrada, por defecto stdin
FILE *yyout Fichero de salida, por defecto stdout
void yymore() El siguiente token reconocido es añadido al actual en yytext, en lugar de reemplazarlo 
int yywrap() Función llamada por el LEX cuando llega a fin de fichero, y que por defecto devuelve el valor 1
int yyless (int n)  Devuelve los n primeros caracteres del token actual al buffer de entrada para que sean reanalizados, y reajusta yytext e yyleng convenientemente
void input ()  Lee el siguiente carácter de la entrada
void unput (int c)  Sitúa el carácter indicado en la entrada
void output (int c) Sitúa el carácter indicado en el fichero de salida