Nombre y apellidos: Grupo (mañana - tarde). Táchese lo que no proceda.

Documentos relacionados
PRÁCTICA. Apellidos, Nombre: Calificación:

Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2007 er. 3 Curso de I.T. Informática de Sistemas.

TEÓRICO ID ; = [ ], $

PRÁCTICA. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de er Curso de I.T. Informática de Sistemas.

TEORÍA. definition TAG. PROPERTIES ID expr EXTENDS ID FIN_TAG. DELAYED : expr

Tema 5 Tabla de Símbolos

TEORÍA. 1.- Escribir en pseudo-código el algoritmo del análisis sintáctico descendente con retroceso.

TEORÍA. N T f n h g $ S S P f C n S S P f C n S S C h P n S S C h P n S S P P f P n f P

Yacc/Bison. Introducción

Apellidos, Nombre: Calificación: PRÁCTICA

TEÓRICO. 3 Curso de I.T. Informática de Sistemas. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de 2006 er

Yacc/Bison. Índice. Construcción del programa objetivo Flujo de control de las funciones yylex() e yyparse()

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

8- LEX-Expresiones regulares

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Tema 3. Estructuras de control

1. Acciones en Yacc. %{ #include <stdio.h> yyerror (char *s) { fprintf (stderr, %s\n, s) ; } %} %% : S \n {printf ( Correcto\n );} ; : ( S ) S

FLEX: A FAST LEXICAL ANALYZER GENERATOR

Programación Estructurada

Programación Estructurada. Sesión 2:El lenguaje de programación C

DESARROLLO DE LA PRÁCTICA DE ANÁLISIS SINTÁCTICO

Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de er Curso de I.T. Informática de Sistemas.

Introducción a la Programación

roducción a la programación con el lenguaje C usando el entorno de trabajo Dev-C. Nociones básicas de programación

10 Introducción a BISON/YACC

Lex. Lex. Ing. Adrian Ulises Mercado Martínez. Enero 30, Ing. Adrian Ulises Mercado Martínez Lex Enero 30, / 27

YACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

Una Herramienta para el Análisis Léxico: Lex

Apellidos, Nombre: Calificación: TEORÍA. 1.- Dada la siguiente tabla LALR(1): WHILE DO WEND INCR ID ; $ prog sent cond 10 D3 D11 D4 2

FLEX: A FAST LEXICAL ANALYZER GENERATOR

Elementos de un programa en C

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Estructuras de Datos Declaraciones Tipos de Datos

Examen escrito de Programación 1

Informática. Prueba de conjunto (0.25 puntos) Considerar el siguiente fragmento de código:

Programación 1 Tema 2. Lenguaje de programación y ejecución de un programa

DEFINICIÓN FORMAL DE UN AFP

Lección 2 Introducción al lenguaje C

Uso de la herramienta YACC

Objetivo N 2. Conocer la Estructura General de un Programa en C++ Estructura de Datos Prof. Egilde Márquez

Examen escrito de Programación 1

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Construcción de un analizador léxico para ASPLE con Lex/Flex. Construcción de un analizador léxico para ASPLE con Lex/Flex

Lex (flex,... ) Generación de analizador léxico p.1

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Diagrama de transiciones del autómata. Tabla de transiciones

Procesadores de Lenguajes Diseño de un lenguaje y de un traductor asociado. Curso Objetivo: Documentación a entregar:

Tema: Autómatas de Estado Finitos

Tema: Análisis Sintáctico

Construcción de una calculadora con Lex/Flex y Yacc/Bison

Teoría de Autómatas y Lenguajes Formales Práctica 4

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Seminario de introducción a Bison

Tema 6. Gestión de tipos

Introducción general al Lenguaje C (2010/2011)

2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.

Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje

Introducción a Funciones

Introducción al Lenguaje de Programación C

Sintaxis de los aspectos generales de un lenguaje de programación

3 Curso de I.T. Informática de Sistemas. TEORÍA

Introducción a los generadores de analizadores léxicos y sintácticos FLEX y BISON: Implementación de una pequeña calculadora

COMPILADORES ANALIZADOR SINTÁCTICO

Conceptos Básicos. Programación

Funcionamiento del A.L.

1000+(4/100)*1000 =1000 * (1+4/100) =1000 * 1.04 = Al finalizar el segundo año, el 4% se aplica sobre los 1040, y obtenemos:

FORMATO DEL FICHERO CON LA TABLA DE SÍMBOLOS

Índice. Estructuras de datos en Memoria Principal. Vectores. Matrices. Cadenas de caracteres. Estructuras. Estructuras de datos en Memoria Externa

Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas

ANÁLISIS LÉXICO EXPRESIONES REGULARES

TEORÍA. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Septiembre de er Curso de I.T. Informática de Sistemas.

Tema 2: La clase string. Índice. Notas. Programación 2. Curso Notas. Definición Declaración Entrada / salida Métodos Operaciones

EDITRAN/TR. Windows/Unix. Manual de referencia

Departamento de Electrónica

Lenguaje de Programación: C++ ARCHIVOS I/O

05 Análisis léxico I Compiladores - Profr. Edgardo Adrián Franco Martínez

PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA

1. Funcionamiento de lex

Guía de estilo y buenas prácticas de programación en C/C++

Práctico 2: Funciones y Punteros en C La teoría general para este práctico puede consultarse en los Capítulos 4 y 5 Notas de Clase

Capítulo 11 INTRODUCCIÓN A LA CODIFICACIÓN EN C. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Tema 2: Elementos básicos de un programa. Tipos de datos, variables y constantes Asignación Operadores y expresiones

UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA APUNTES DE CÁTEDRA EL METACOMPILADOR BISON INTERFAZ FLEX - BISON

Objetivo 2.. ESTRUCTURAS DE DATOS. Docente. Yesika Medina

UNIDAD 1. Algoritmo se define como un conjunto de instrucciones que la computadora debe seguir para resolver un problema.

Estructuras de Datos Estáticas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos estáticas

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Qué es Lex? Busca concordancias de un conjunto de expresiones regulares y un archivo de entrada y ejecuta acciones asociadas.

Transcripción:

PRUEBA T1 Traductores, compiladores e intérpretes Septiembre. Curso 08/09 Nombre y apellidos: Grupo (mañana - tarde). Táchese lo que no proceda. Se desea construir un programa Lex que reconozca los siguientes patrones y realice las acciones indicadas: 1. Espacios, tabuladores que deben ignorarse. 2. Retornos de carro que sirven para contar el número de líneas. Por lo demás deben ignorarse. 3. Comentarios que pueden estar anidados. Deben ignorarse. Un comentario empieza por (* y finaliza en *). 4. Las palabras reservadas LOOP, EXIT, WHEN y END. Deben ignorarse. 5. Identificadores de usuario que sólo pueden estar formados por una letra minúscula. Debe contarse cuántas veces aparece cada identificador. Al final del análisis debe aparecer el total de identificadores encontrados. 6. Cualquier otra cosa que se reconozca debe emitirse por pantalla avisando de que se trata de un error. Además hay que indicar el número de línea en que se encuentra el fallo. Al finalizar la función yylex() debe indicarse por pantalla: El número de líneas de la entrada reconocida. El número de palabras reservadas reconocido. El número de veces que aparece cada identificador. Un ejemplo de entrada y salida sería: (* Un ejemplo *) LOOP, Entrada Fallo en linea 2 con,. Salida WHEN abcaab EEND a a a (* (* a a a (* aaa (* END LOOP FOR cualquier cosa *) *) b b *) A *) A % IF b cc (* FOR *) Fallo en linea 6 con E. Fallo en linea 13 con A. Fallo en linea 14 con %. Fallo en linea 15 con I. Fallo en linea 15 con F. No. de lineas: 16. No. de palabras reservadas: 3. a aparece 6 veces. b aparece 3 veces. c aparece 3 veces.

PRUEBA T2 Traductores, compiladores e intérpretes Septiembre. Curso 08/09 Nombre y apellidos: Grupo (mañana - tarde). Táchese lo que no proceda. Se desea construir los programas Lex y YACC destinados a reconocer como válidas listas de números naturales pares separados por comas que constituyan secuencias no descendentes. Una secuencia debe estar formada por, al menos, tres números de manera que cada número (del segundo en adelante) debe ser mayor o igual a la suma de todos los anteriores. Por ejemplo: Secuencia Es válida? 2, 2, 6, 10, 22, 50 Sí 1, 1, 2, 3, 7, 10, 17 No 0, 0, 11, 12, 23, 35, 58 No 2, 4, 10, 16, 30, 100 No 0, 0, 0, 0, 0, 0, 0 Sí 4, 6 Error de sintaxis El programa, tras leer la secuencia, debe emitir por pantalla sencillamente la palabra SÍ o NO indicando, respectivamente, si la secuencia leída es o no válida.

PRUEBA T3 Traductores, compiladores e intérpretes Septiembre. Curso 08/09 Nombre y apellidos: Grupo (mañana - tarde). Táchese lo que no proceda. En este ejercicio se parte del siguiente supuesto: Un amigo que estudia Ciencias de la comunicación nos ha proporcionado una película muda junto con un fichero de texto con los subtítulos en español. El fichero de subtítulos tiene algunos problemas que hacen que no sea reconocido bien por nuestro reproductor y que la aparición de subtítulos salga a destiempo con respecto a la imagen de la pantalla. Nuestro objetivo será solucionar esos problemas. El fichero de subtítulos estándar (extensión.srt) tiene el siguiente formato del siguiente ejemplo: 1 00:00:20,000 --> 00:00:24,400 El Estado se burla del ciudadano y se adjudica el derecho a decidir por el, 2 00:00:24,600 --> 00:00:27,800 tan solo porque es votado cada lustro... En este ejemplo puede observarse cómo cada subtítulo está formado por, al menos, dos líneas, siendo la primera un número consecutivo de 1 en 1 empezando por el 1 y la segunda un lapso de tiempo donde el inicio y el final están expresados en hh:mm:ss:eee (horas, minutos, segundos y milésimas) y separados por el símbolo -->. A partir de esta segunda línea puede haber una o más líneas que son el contenido en sí del subtítulo, de manera que la idea es que dicho texto aparezca en pantalla durante el lapso de tiempo indicado por la línea que le precede. En nuestro caso debemos leer un fichero con estas características controlando lo siguiente: En la entrada, cada bloque de subtítulo puede estar separado por varias líneas en blanco. Nosotros debemos separarlas por sólo una. Si un bloque de subtítulo no tiene línea/s de texto asociada, nosotros no la emitiremos y sacaremos un mensaje de error. Debemos asegurarnos que los números de los subtítulos sean incrementales de uno en uno partir del 1. Si algún subtítulo no cumple esto sacaremos un mensaje de error y no lo emitiremos. Debemos asegurarnos que el primer valor de un lapso de tiempo es inferior al segundo valor. Si algún subtítulo no cumple esto sacaremos un mensaje de error y no lo emitiremos. Debemos asegurarnos que el primer valor de un lapso de tiempo es superio al segundo valor del lapso anterior. Si algún subtítulo no cumple esto sacaremos un mensaje de error y no lo emitiremos. Ante cualquier error de sintaxis sacaremos un mensaje de error y no emitiremos el subtítulo que tenga el error. A todos los valores de tiempo hay que añadirles 12 segundos y 630 milésimas para sincronizarlos con la película. Con este objetivo en mente y partiendo de los programas LEX y YACC que se proporcionan, se pide completarlos para conseguir el propósito del enunciado.. Nota: Se recomienda el uso de la función sprintf.

Como ejemplo, se muestra la salida que debe producirse ante una cierta entrada: Entrada Salida 1 00:00:20,000 --> 00:00:24,400 El Estado se burla del ciudadano y se adjudica el derecho a decidir por el, 2 00:00:24,600 --> 00:00:27,800 tan solo porque es votado cada lustro. 3 00:00:30,600 --> 00:00:37,800 Se jactan de "democratas" cuando realmente son "demofobos". 4 00:00:37,801 --> 00:00:37,802 5 00:00:40,600 --> 00:00:37,800 El alcalde es nuestro servidor. 6 00:00:50,600 --> 00:00:57,800 La palabra "ministro" procede del latin "minister" y quiere decir servidor. 1 00:00:32,630 --> 00:00:37,030 El Estado se burla del ciudadano y se adjudica el derecho a decidir por el, 2 00:00:37,230 --> 00:00:40,430 tan solo porque es votado cada lustro. 3 00:00:43,230 --> 00:00:50,430 Se jactan de "democratas" cuando realmente son "demofobos". Falta el texto del subtitulo. Lapso de tiempo incorrecto. 6 00:01:03,230 --> 00:01:10,430 La palabra "ministro" procede del latin "minister" y quiere decir servidor. Lapso de tiempo no consecutivo con el anterior. 8 00:01:13,230 --> 00:01:21,630 FIN 7 00:00:20,000 --> 00:00:24,400 Aun crees que decides lo más minimo excepto quien te roba? 8 00:00:60,600 --> 00:00:69,000 FIN

Fichero EJEM9L.LEX %{ int actual=0; % %% ^[1-9][0-9]* { yylval.numero = atoi(yytext); // Controlar que el numero sea consecutivo respecto de actual if (yylval.numero!= actual+1){ fprintf(stderr, "Numero fuera de secuencia.\n"); fallo = true; else actual++; return NUMERO; [0-9][0-9]\:[0-9][0-9]\:[0-9][0-9]\,[0-9][0-9][0-9] { yytext[2]=yytext[5]=yytext[8]=0; yylval.tiempo.hora = atoi(yytext); yylval.tiempo.minuto=atoi(yytext+3); yylval.tiempo.segundo=atoi(yytext+6); yylval.tiempo.milesima=atoi(yytext+9); return TIEMPO; "-->" { return FLECHA; [^ \t\n]+ { strcpy(yylval._texto, yytext); return PALABRA; [ \t]+ { return ESPACIO; \n { return '\n'; Fichero t3y.yac %{ #include <stdio.h> #include <stdlib.h> #include <string.h> #define false 0 #define true 1 int fallo=false; long finlapsoanterior=0; // Valor expresado en milésimas; typedef struct { int hora, minuto, segundo, milesima; _tiempo; void incrementa(_tiempo * ptr){ ptr->milesima+=630; // Controlar el acarreo y sumar los 12 segundos. if (ptr->milesima >= 1000) { ptr->milesima-=1000; ptr->segundo++; ptr->segundo += 12; if (ptr->segundo < 60) return; ptr->segundo -= 60; ptr->minuto++; if (ptr->minuto < 60) return; ptr->minuto -= 60; ptr->hora++; return; void borraretornosalfinal(char * texto){ int i; for(i=strlen(texto)-1; i!=-1; i--) if (texto[i]==10 texto[i]==13) texto[i]=0; else return; % %union{ int numero; _tiempo tiempo; char _texto[200]; %token ESPACIO FLECHA %token <texto> PALABRA

%token <numero> NUMERO %token <tiempo> TIEMPO %type <texto> texto lapso %% prog : retornosiniciales prog NUMERO '\n' lapso '\n' texto { if (! fallo){ borraretornosalfinal($6); if (strlen($6) == 0) fprintf(stderr, "Falta el texto del subtitulo.\n"); else printf("%d\n%s\n%s\n\n", $2, $4, $6); fallo = false; prog error ; retornosiniciales : /* Epsilon */ retornosiniciales '\n' ; lapso : TIEMPO ESPACIO FLECHA ESPACIO TIEMPO { long t1, t2; t1 = ((long)$1.hora)*3600000l+((long)$1.minuto)*60000l+((long)$1.segundo)*1000l+((long)$1.milesima); t2 = ((long)$5.hora)*3600000l+((long)$5.minuto)*60000l+((long)$5.segundo)*1000l+((long)$5.milesima); // Controlar el fin del lapso anterior // Controlar que el lapso sea creciente if (finlapsoanterior > t1){ fprintf(stderr, "Lapso de tiempo no consecutivo con el anterior.\n"); fallo = true; else if (t1 < t2 ) { finlapsoanterior = t2; incrementa(&($1)); incrementa(&($5)); sprintf($$, "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d", $1.hora, $1.minuto, $1.segundo, $1.milesima, $5.hora, $5.minuto, $5.segundo, $5.milesima ); else { fprintf(stderr, "Lapso de tiempo incorrecto.\n"); fallo = true; ; texto : /* Epsilon */ { sprintf($$, ""); texto PALABRA { sprintf($$, "%s%s", $1, $2); texto ESPACIO { sprintf($$, "%s ", $1); texto TIEMPO { sprintf($$, "%s%02d:%02d:%02d,%03d", $2.hora, $2.minuto, $2.segundo, $2.milesima); texto '\n' { borraretornosalfinal($1); sprintf($$, "%s\n", $1); ; %% #include "t3l.c" int main(){ yyparse(); return 0; void yyerror(char * s){ printf("%s\n", s);