Sunteți pe pagina 1din 7

LENGUAJ ES FORMALES Y AUTMATAS

PRCTICA DE LABORATORIO 2

Una vez introducida la forma en que opera la herramienta flex, en esta prctica vamos a
presentar el lenguaje que utiliza para describir las especificaciones lxicas.

Qu hace flex?

La herramienta flex parte de una especificacin lxica (analex.l), donde se incluye una
serie de expresiones regulares, y produce un analizador lxico escrito en C que tendr
dos partes que llamaremos interfaz (analex.h) e implementacin (analex.c).

El cometido del analizador es encontrar en un texto (entrada.txt) aquellas secuencias de
caracteres que concuerdan con alguna de las expresiones regulares y ejecutar la accin
que le haya sido asociada en la especificacin lxica.

El formato del fichero de entrada

Las especificaciones lxicas escritas en flex deben ajustarse al siguiente formato:

%header{
<cdigo C de cabecera>
%}
%{
<cdigo C de declaracin>
%}
<definicin de macros>
%%
<expresiones regulares y acciones>
%%
<cdigo C de implemetacin>

?? En la primera de las secciones se incluyen declaraciones en C que queremos que
aparezcan dentro de la interfaz del analizador lxico que vamos a generar. La
mayora de las veces tendremos suficiente con el interfaz por defecto, as que
utilizaremos esta seccin en contadas ocasiones.
?? En la segunda seccin se incluyen declaraciones en C de elementos que vayan a ser
utilizados en el resto de la especificacin. Estos elementos no aparecern dentro de
la interfaz del analizador lxico que vamos a generar.
?? En la tercera seccin se definen una serie de macros. Las macros no van a ser ms
que expresiones regulares a las que se les da un nombre, y su utilidad es la de hacer
las especificaciones posteriores ms compactas.
?? La cuarta seccin constituye el ncleo de la especificacin y se compone de una
serie de expresiones regulares a las que se les asocia una accin en C.
?? La ltima seccin permite introducir las implementaciones, en C, de los elementos
declarados en la segunda seccin. Su uso no es del todo recomendable ya que no
favorece la creacin de mdulos reutilizables.

Expresiones regulares

El lenguaje lex (que es el que utiliza la herramienta flex) proporciona un conjunto muy
amplio de elementos para definir expresiones regulares. Primero vamos a presentar los
ms bsicos:

?? Caracteres: Todos los caracteres del cdigo ASCII. Los siguientes caracteres tienen
un significado especial:

" [ ] ^ - ? . * + | ( ) $ / { } % < > \

Si queremos utilizarlos como operandos de una expresin regular tendremos que
anteponerle la barra invertida (\) o encerrarlos entre comillas dobles (")
?? Cualquier carcter (.): La expresin regular . (un solo punto) reconoce cualquier
carcter excepto el salto de lnea
?? Secuencias de escape:

<<EOF>> reconoce el fin de fichero
\n reconoce el fin de lnea
\t reconoce el tabulador

?? Concatenacin: Yuxtaposicin de caracteres
?? Unin: Se utiliza el carcter especial | como operador de unin
?? Clausura: Se utiliza el operador posfijo *
?? Parntesis: Se usan para romper las prioridades de los operadores
?? Llaves: Se usan para expandir las macros

La variable yytext

Cuando el reconocedor generado por flex detecta que una secuencia de caracteres
encaja con una expresin regular, almacena esos caracteres en la variable predefinida
yytext. Esta variable es del tipo (char *).

Un ejemplo simple

La siguiente especificacin lxica (analex.l) reconoce expresiones horarias que encajan
o bien con el patrn HH:MM o bien con el patrn H:MM.

%{
#include <stdio.h>
%}
blanco " "|\t|\n
digito 0|1|2|3|4|5|6|7|8|9
digito2 {digito}{digito}
hora ({digito}|{digito2})":"{digito2}
%%
{blanco}* {;}
{hora} {printf("Encontre la hora %s \n",yytext);}
. {;}
%%

La funcin yylex()

Es el ncleo del programa generado por flex. Su misin es recorrer secuencialmente el
fichero de entrada detectando aquellas secuencias de caracteres que encajen con alguna
expresin regular para ejecutar su correspondiente accin. Por defecto, al alcanzar el
final del fichero de entrada, la funcin simplemente devolver el valor 0.

La variable yyin

Para indicarle a flex cul es el fichero de entrada utilizaremos la variable yyin. Esta
variable es del tipo (FILE *) y est declarada en el fichero de cabecera generado con
la opcin -h.

Cmo llamar a yylex()?

El fichero principal (inicio.c) contiene la llamada a la funcin yylex.

#include <stdio.h>
#include "analex.h"
main()
{
yyin=fopen("entrada.txt","r");
yylex();
fclose(yyin);
}

Tras compilar la especificacin lxica con la herramienta flex y crear un proyecto para
incorporar el analizador lxico en un programa, quedara aplicar el anlisis lxico sobre
un fichero de texto (entrada.txt). Como ejemplo de entrada proponemos la siguiente:

No estuve a las 9:30 pero si a las
10:00. Te aviso que el martes quiero
llegar entre las 15:30 y las 15:45 como
muy tarde. Lo digo para que que no
vayas antes de las 18:20.

El resultado del anlisis sera el siguiente:

Encontre la hora 9:30
Encontre la hora 10:00
Encontre la hora 15:30
Encontre la hora 15:45
Encontre la hora 18:20

La accin asociada al final del anlisis

Podemos modificar el comportamiento del analizador para que realice otras acciones
justo antes de terminar el anlisis. Para conseguirlo debemos incluir en la especificacin
lxica la expresin regular <<EOF>> junto con la accin adicional que deseamos.
Lgicamente, es responsabilidad del especificador que el valor 0 sea devuelto al final.
Por ejemplo, para comunicar el final del anlisis podramos aadir lo siguiente:

<<EOF>> {printf("\nHe acabado el anlisis\n");
return 0;}

Ms sobre expresiones regulares

?? Clases: Las clases o conjuntos de caracteres pueden ser descritas enmarcando entre
corchetes los caracteres seleccionados. Por ejemplo, la expresin

[abcde]
es equivalente a la expresin
a|b|c|d|e

Dentro de los corchetes pierden su caracterstica especial los siguientes caracteres,
es decir, no hace falta precederlos de la barra invertida o entrecomillarlos para
utilizarlos como operandos:

? . * + | ( ) $ / { } % < >

?? Rangos: En los conjuntos pueden usarse rangos para compactar las especificaciones.
Por ejemplo, las letras minsculas seran descritas mediante: [a-z]
?? Rangos combinados: Tambin es factible combinar varios rangos. Por ejemplo, para
representar todas las letras y los dgitos bastara con escribir: [a-zA-Z0-9]
?? Complementacin: Las clases negativas se expresan con el operador ^ e indican el
conjunto de caracteres que no se reconocen. Por ejemplo: [^0-9] tiene como
lenguaje asociado todos aquellos caracteres que no son dgitos.
?? Clausura positiva {exp}+: Si {exp} es una expresin regular entonces
{exp}+={exp}{exp}*
?? Opcin {exp}?: Dada la expresin regular {exp}entonces {exp}?={exp}|{lambda}.
?? Repeticin acotada {exp}{n,m} : Si n y m son dos nmeros naturales y {exp} es una
expresin regular entonces {exp}{n,m} es el lenguaje que incluye a todas las
palabras {exp}
i
con n<=i<=m. Como podemos observar, este operador da soporte a
la potencia de lenguajes. Por ejemplo ab{2,4} describe el lenguaje siguiente
{abb,abbb,abbbb}.

Ejemplo

La siguiente especificacin lxica cuenta el total de nmeros enteros y de palabras que
figuran en un texto. En el ejemplo podemos observar que una palabra es una secuencia
no vaca que incluye tan slo letras.

%{
#include <stdio.h>
int contpal=0,contnum=0;
%}
blanco " "|\t|\n
palabra [A-Za-z]+
signo ("+"|"-")?
digito [0-9]
numero {signo}{digito}+
%%
{blanco}* {;}
{palabra} {contpal++;}
{numero} {contnum++;}
<<EOF>> { printf("Total de palabras: %d \n",contpal);
printf("Total de numeros: %d \n",contnum);
return 0;}
. {;}
%%



EJERCICIOS

1. Compilar y ejecutar los ejemplos del enunciado comprobando su salida.
2. Mostrar la hora de cada expresin horaria que figura en un texto.
3. Mostrar los minutos de las expresiones horarias incluidas en un texto.
4. Mostrar tan slo aquellas expresiones horarias de un texto que sean coherentes.
(Como ejemplo de expresiones horarias incoherentes podemos enunciar las dos
siguientes: 68:00, 14:95). Resuelva este problema de dos formas distintas:
?? Definiendo un patrn que reconozca tan slo expresiones horarias coherentes
?? Modificando la accin para el patrn {hora} para comprobar que la
variable yytext contiene expresiones horarias coherentes.
5. Calcular para cada expresin horaria incluida en un texto cuntos minutos han
transcurrido desde la expresin horaria 00:00.
6. Calcular cuntos minutos han transcurrido entre cada par de expresiones horarias
consecutivas de un texto. (Para la primera fecha considerar los minutos
transcurridos desde la expresin horaria 00:00).
7. Indicar si estn ordenadas cronolgicamente las expresiones horarias recogidas
en un texto segn su aparicin en el mismo.
8. Reconocer y mostrar por pantalla las fechas incluidas en un texto. Las fechas
pueden estar escritas en distintos formatos que cumplirn el siguiente convenio:
?? Los das y los meses pueden ser descritos mediante uno o dos dgitos
?? Los aos pueden venir descritos mediante dos o cuatro dgitos
?? Para separar los das, meses y aos se admiten los dos puntos o la barra
9. Sumar los valores de todos los nmeros naturales que encuentre en un fichero.
Por ejemplo, al procesar el fichero siguiente debe devolver el valor 2222

a 30 aa bacd + aa *
aa 170 2000 aaa
xxxa 18 aaaa 4

10. La forma en que son descritos los nmeros de telfonos vara entre pases
distintos. Incluso en un mismo pas se permiten varias notaciones. A
continuacin mostramos una tabla con ejemplos de notaciones para distintos
pases:

NOTACIN PAIS NOTACIN PAS
0171 378 0647 Reino Unido +45 43 48 60 60 Dinamarca
(44.171) 830 1007 Reino Unido 95-51-279648 Pakistn
+44(0) 1225 753678 Reino Unido +411/284 3797 Suiza
01256 468551 Reino Unido (94-1) 866854 Sri Lanka
(202) 522-2230 E.E.U.U. +49 69 136-2 98 05 Alemania
1-925-225-3000 E.E.U.U. 33 1 34 43 32 26 Francia
212. 995.5402 E.E.U.U. ++31-20-5200161 Holanda

Disear un analizador lxico que sustituya las apariciones de nmeros de telfono de
un texto por el pas al que pertenece el nmero.
11. Generar un nuevo fichero que modifique la entrada aplicando lo siguiente:
?? Elimine todas las palabras que empiecen por "a".
?? Ponga en maysculas las palabras que empiecen por "b" y terminen con "o".
?? Ponga en minsculas todas las palabras que empiecen con "c".
?? Repita todas las palabras que empiecen con "du".
12. Mostrar cuntas palabras incluidas en un texto comienzan por vocal, cuntas por
minsculas y cuntas por maysculas.
13. Modificar la especificacin para que nos informe, para cada vocal v, cuantas
palabras de un texto comienzan por dicha vocal v.
14. Generar un fichero donde se incluyan todas las palabras distintas que figuran en
un texto junto con el nmero de veces que aparece en el mismo.

S-ar putea să vă placă și