Tiempo de realización: 3 horas Ejercicio 1 (3 puntos): Se ha definido una cierta sintaxis para representar información de unidades temáticas en un fichero de texto. En este ejercicio nos planteamos el desarrollo de un analizador de estos ficheros de definiciones de acuerdo a las siguientes especificaciones: 1) La definición de una unidad temática está delimitada por una etiqueta de apertura <COMIENZO-TEMA> y una etiqueta de cierre. 2) Después de la etiqueta de apertura de la unidad temática lo que se indica es el título de dicha unidad (secuencia de letras y blancos). 3) Después del título puede venir una lista de descriptores y la especificación de la dificultad de la unidad, en ese orden. 4) Los descriptores son una lista de palabras clave. Se especifican utilizando la etiqueta <DESCRIPTORES=...>, donde "..." es la lista de descriptores, separados por espacios. 5) La dificultad se especifica mediante una etiqueta <DIFICULTAD=...>, donde "..." describe la dificultad de la unidad (secuencia de letras y blancos). 6) Como parte de la definición de la unidad temática pueden aparecer, después de los descriptores y dificultad opcionales, otras unidades temáticas anidadas. 7) Los saltos de línea, tabuladores y espacios en blanco entre elementos (incluso si están entre palabras de un título) no son significativos. Un ejemplo del contenido de un fichero de definición es como sigue: <COMIENZO-TEMA>Dispositivos de almacenamiento <COMIENZO-TEMA>Discos duros <DESCRIPTORES= discos rpm velocidad> <DIFICULTAD=baja> <COMIENZO-TEMA>Funcionamiento <COMIENZO-TEMA>Modelos <COMIENZO-TEMA>CDROMs y DVDs <COMIENZO-TEMA>Cintas y otros <COMIENZO-TEMA>Aplicaciones <DIFICULTAD=muy baja> <COMIENZO-TEMA>Aplicaciones de Windows <COMIENZO-TEMA>Aplicaciones de Linux
Se pide: 1 A) Completa el siguiente fragmento de fuente Flex (no son necesarios más tokens). Si lo crees conveniente, puedes insertar primero una sección de definiciones para el fuente Flex....... {... /* Ignorar. */ }... {... return tkcomienzo_descriptores;}... {... return tkcomienzo_tema;}... {... return tkfin_tema;}... {... return tkcomienzo_dificultad;}... {... return tkfin_descriptores_o_dificultad;}... {... return tksecuencia_letras;}... {fila++; columna=0;}... {/* Error... */} 1 B) Escribe un fuente Bison para reconocer la sintaxis de un documento de definición de unidades temáticas. Puedes utilizar, entre otros, los siguientes no terminales: unidadestematicas, unidadtematica, cuerpounidadtematica, titulo, descriptores, dificultad, listapalabras. 1 C) En este apartado debemos añadir las acciones semánticas necesarias en el fichero fuente Bison para sacar por la salida estándar la estructura jerárquica de las unidades temáticas, numerándolas. Las unidades temáticas comienzan a numerarse en 1 y se van añadiendo subunidades conforme sea necesario (unidad 1, unidad 1.1, unidad 1.2, unidad 2, etc.). Para el ejemplo anterior, la salida debería ser: 1.- Dispositivos de almacenamiento 1.1.- Discos duros 1.1.1.- Funcionamiento 1.1.2.- Modelos 1.2.- CDROMs y DVDs 1.3.- Cintas y otros 2.- Aplicaciones 2.1.- Aplicaciones de Windows 2.2.- Aplicaciones de Linux Este apartado deberá resolverse definiendo atributos adecuados, sin utilizar variables auxiliares (excepto en todo caso una variable entera para almacenar el nivel de indentación actual). Es posible que sea necesario realizar ligeras modificaciones en el fuente Bison del apartado anterior. Se puede asumir que la numeración de una unidad temática nunca ocupará más de 256 caracteres.
Ejercicio 2 (3 puntos): Considera la siguiente gramática (escrita con sintaxis tipo Bison): %% S : '[' L ']' '0' ; L : S L S ; 2 A) Completa el autómata y las tablas del análisis SLR(1) (en la hoja adjunta). 2 B) Describe los pasos del análisis SLR(1) para la cadena de entrada [[0]00]$ (en la hoja adjunta) 2 C) La gramática no es de tipo LL(1). Transfórmala en una equivalente que si lo sea, y prueba que tu gramática equivalente si es LL(1). Ejercicio 3 (2 puntos): Escribe una gramática libre de contexto de la clase LL(1) que genere el mismo lenguaje que esta expresión regular, y prueba que la gramática dada es, efectivamente, de esa clase. (a c+ ba bc)* b+ Ejercicio 4 (2 puntos): Dada la siguiente gramática (escrita con sintaxis de Bison): %% S : A 'a' B 'b' C S 'b' ; A : 'a' A 'c' ; B : 'd' B 'e' /* epsilon */ ; C : A 'c' B 'c' 'd' ; Construye, en C, un analizador sintáctico descendiente recursivo. Supón que tienes ya definida la función int yylex(), que devuelve el siguiente token en cada invocación (como la de Flex).
Nombre alumno/a: Ejercicio 2 A) Autómata del análisis SLR(1) 0 1 6 2 4 3 5 7 ESTA HOJA DEBE ENTREGARSE CON EL EXAMEN
Nombre alumno/a: Ejercicio 2 A) Tablas del análisis SLR(1) 0 1 2 3 4 5 6 7 (Numerando las producciones de la gramática de esta forma:) 1) S' --> S 2) S --> [ L ] 3) S --> 0 4) L --> S L 5) L --> S Ejercicio 2 B) Análisis de la cadena Pila Entrada Acción [[0]00]$ ESTA HOJA DEBE ENTREGARSE CON EL EXAMEN