Professional Documents
Culture Documents
Enunciado:
El objetivo de esta prctica consiste en aprender a cmo utilizar el analizador lxico FLEX. Para este propsito se empezar describiendo brevemente cmo funciona un programa FLEX, cmo est estructurado y cmo compilarlo. El manual completo de FLEX se encuentra en la pgina WEB de la asignatura en el aula virtual: http://aulavirtual.uji.es bajo la etiqueta Prcticas. Nota: Al final de cada sesin de prcticas hay que entregar la solucin a cada uno de los ejercicios marcados con (**) (No olvidar escribir nombre, apellido en cada hoja entregada y grupo de prcticas en el que se est apuntado).
Qu es un analizador lxico?
Qu es FLEX? FLEX es un analizador lxico bajo licencia GPL. Cada vez que
se encuentre uno de los patrones especificados en FLEX se puede ejecutar un conjunto de acciones asociadas. FLEX es el analizador de dominio pblico compatible con el analizador lxico ms frecuentemente utilizado: LEX (bajo sistema UNIX). FLEX (y LEX) genera, dada una especificacin correcta de patrones y acciones, un programa en lenguaje C que puede ser compilado para obtener un programa ejecutable.
Cmo se especifican los patrones? Cada patrn es una expresin regular. Algunos de los patrones que se pueden utilizar son (la lista completa est en el manual de FLEX): Patrn
a . [abc] abc
Significado
Carcter a Cualquier carcter excepto \n El carcter a, el b o el c La cadena abc
Patrn
r* r+ r? r{1,3}
Significado
Cero o ms r Una o ms r Cero o una r Entre 1 y 3 r
Patrn
[cv-yA] [^aB-F] " [a-wp" ^r
Significado
El carcter c, el A o un carcter entre el v y el y Cualquier carcter excepto a o un carcter entre B y F La cadena " [a-wp" Una r al comienzo de lnea
Patrn
{nombre} \x r|s r/s
Significado
La expansin de la definicin de nombre Lo que sea x, por ejemplo \n o \t o \a o \\ o \b o \c Una r o una s Una r slo si le sigue una s
Patrn
[abc]+ (abc)+ abc[abc]*abc .+ 0|[1-9][0-9]* 0{1,3}1{2}0{,5} [ ]+ [Bb][Ee][Gg][Ii][Nn] [^ \t\n.]+[.][^ \t\n.]+
Significado
Cadena
Hfgccbbcbada hfgccbbcbaaab fabcbbccacabc abc\naaa\n\n\n 00012ab000a90 011 0 0100000 asc a d d ff\n
Cules?
Ejercicio: Buscar e.r. en FLEX equivalentes a cada una de las e.r. de la tabla anterior.
Consta de tres
En la primera seccin (opcional) se especifican definiciones bsicas que sern reutilizadas en otras secciones. La segunda seccin est compuesta de parejas: patrn accin. En la que patrn es una expresin regular y accin es un conjunto se sentencias en C de la forma {sentencia1; sentencia2; ; sentenciaN;}. Estas sentencias especifican las acciones a realizar cuando se localiza el patrn asociado. Cada seccin se separa de la siguiente mediante el empleo de una lnea que contiene nicamente %%. En la tercera seccin (opcional) se especifican funciones auxiliares que, entre otras cosas, pueden ser utilizadas en la parte accin de la segunda seccin.
Ejemplo 2:
%{ int num_lineas = 0, num_caracteres = 0; %} %% \n {++num_lineas; ++num_caracteres;} . {++num_caracteres;} %% int main() { yylex(); printf(\n # de lineas = %d, num_lineas); printf(\n # de caracteres = %d\n, num_caracteres) ; }
Supngase que se tiene el programa ejemplo.fl que contiene una especificacin correcta de un fichero FLEX. La primera accin a realizar es transformarlo en un programa en C, para ello se utiliza el siguiente comando: flex ejemplo.fl Como resultado se obtendr un fichero denominado lex.yy.c que, al ser un programa en C, puede ser compilado mediante el siguiente comando: gcc lex.yy.c lfl. Como resultado se obtiene un fichero ejecutable a.out
Ejercicios:
1. Disear patrones FLEX que reconozcan a) b) c) d) Nombres de variables Nmeros enteros con y sin signo Nmeros reales en coma flotante con y sin signo. Nmeros reales en notacin exponencial con signo opcional y con punto tambin opcional e) Operadores matemticos: =,+, -, *, /, DIV, MOD f) Parntesis: (, ) g) Comentarios: # esto es un comentario que acaba en una lnea
2. Introducir los programas FLEX indicados en esta memoria de prcticas, compilarlos y ejecutarlos. 3. Buscar en el manual de FLEX (aulavirtual.uji.es) cmo se pueden incluir comentarios en un programa FLEX. 4. Disear un programa que analice un texto de entrada y sustituya dos o ms blancos seguidos por un nico blanco y dos o ms tabuladores por un nico tabulador. 5. Disear un programa FLEX que borre los comentarios que aparezcan en un fichero de texto (se suponen comentarios de una sla lnea que empiezan por el smbolo #, como el caso del patrn g del ejercicio 1). (**)
6. Disear un programa FLEX que imprima un texto tal y como est en el fichero de entrada, pero que cada vez que detecte un ; imprima el texto que va a continuacin en otra lnea nueva. (**) 7. Disear un programa FLEX que indique cuntas veces ha detectado un nmero entero en un fichero de texto. 8. Disear un programa FLEX que, cada vez que detecte una cadena que pertenezca a uno de los patrones del ejercicio 1, imprima un mensaje que indique el tipo de cadena que ha localizado. Por ejemplo, la cadena +542.12 pertenece al lenguaje denotado por el patrn c) y, por lo tanto, se debera de imprimir REAL_COMA_FLOTANTE, con la cadena -2.4E-5 se debera de imprimir REAL_EXPONENCIAL. (**)
Atencin, definicin importante: A las etiquetas que denotan que se ha encontrado una cadena que se corresponde con la expresin regular se les denomina token, por lo tanto, REAL_COMA_FLOTANTE y REAL_EXPONENCIAL son tokens. Cada token tiene un valor asociado por defecto Cul puede ser?
9. Disear un programa FLEX que identifique e imprima los nmeros de telfono mvil que hay en un texto de entrada. 10. Disear un programa FLEX que identifique e imprima los nmeros de telfono mvil y fijo que hay en un texto de entrada. (**)