{ Reglas}
%%
{ Rutinas de usuario }
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
% }
¿Cómo se definirian las letras?¿Y los numeros?
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?
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á:
A igualdad de caracteres opta
por el primer patrón
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.
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}
Para los caracteres no reconocidos
del fichero de entrada la acción es copiarlos en el fichero de salida
; 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
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.
Cree un programa que cuente el numero de palabras, caracteres y lineas en un fichero.
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 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
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.
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 |