Procesadores de Lenguajes Examen final 9/6/2006 APELLIDOS: NOMBRE: 1.1 1.2 2.1 3.1 TOTAL NOTA Cuestiones: En el lenguaje de “scripting” BASH los números se representan en la forma base#numero. Por ejemplo, 16#42 será interpretado como 42 en base 16. La siguiente gramática describe la estructura de este formato, y las acciones semánticas asociadas para calcular el equivalente de un número en base 10. 1. Reglas N ::= DS1 ‘#’ DS2 DS ::= DS1 digito DS ::= digito Acciones semánticas N.v = DS2.v DS2.b = DS1.v DS1.b = 10 DS.v = DS1.v * DS1.b + digito.v DS1.b = DS.b DS.v = digito.v Cada símbolo terminal ‘digito’corresponde a un dígito entre 0-9, y se reconoce durante el análisis morfológico. El analizador morfológico asigna como valor del atributo ‘v’ del símbolo ‘digito’ el valor entero correspondiente al dígito. Se pide: 1.1 (0,2 puntos) Dibujar el árbol de análisis para la entrada ‘8#45’. 1.2 (0,8 puntos) Calcular los valores de todos los atributos en el árbol de análisis. 2. Suponer que en un lenguaje parecido a BASH se permiten números en el formato siguiente: Entero Decimal: Entero en base x: [0-9]+ [0-9]+#[0-9]+ ej., 79 ej., 8#77 ‘+’ indica que ocurre el carácter anterior 1 o más veces. Una gramática posible para este lenguaje, que cumple los requisitos de precedencia simple, sería la siguiente: Num ::= DS | DS1 # DS1 DS1 ::= DS DS ::= DS digito | digito Se pide: 2.1 (1 punto) Construir la tabla de precedencia simple para la gramática anterior. 3. Dado el siguiente programa: int i=0, b = 10, c=5, d; while (i++ < 10) { if (c != i) d = b /(c – i); } Se pide: 3.1 (1 punto) Proporcionar el resultado de generar el código intermedio en forma de cuádruplas. Procesadores de Lenguajes Examen final 9/6/2006 APELLIDOS: NOMBRE: 4.a 4.b 5 6.a 6.b 6.c 6.d TOTAL NOTA 4. Un lenguaje de programación acepta la definición de series finitas de números naturales, por ejemplo: {1,2,3,4,6} o {10,12,14}. Todas las series deben tener al menos un elemento. Se pide: a) (0,5 puntos) Construir una gramática LL(1) que defina este lenguaje. b) (0,5 puntos) Construir la tabla de análisis LL(1) para la gramática del apartado anterior 5. (1 punto) Dado el siguiente código ¿cuál será el contenido de la pila una vez alcanzado el punto indicado por la flecha? Indicar la posición del puntero base (BP o EBP) y del puntero de pila (SP o ESP). int rutina (int a, char *b) { double i; int j, k; i = 7; j = 4; ... m = rutina(3, 5); ... if (a < b) k=i else k = j; return k; } 6. Conteste a las siguientes preguntas sobre la tabla de símbolos: a) (0,25 puntos)¿qué es una tabla de símbolos? b) (0,25 puntos)¿qué tipo de información se almacena en una tabla de símbolos? c) (0,25 puntos)¿cuáles son las operaciones que pueden realizarse sobre una tabla de símbolos? d) (0,25 puntos)¿en qué situaciones se utilizan cada una de las operaciones descritas en el apartado c) Procesadores de Lenguajes Examen final 9/6/2006 APELLIDOS: NOMBRE: 7 8.1 8.2 8.3 9 TOTAL NOTA 7. (1 punto) Se está diseñando un lenguaje de programación para manejar objetos gráficos. Entre las constantes que tiene que manipular están las siguientes: Constantes numéricas de tipo real con los dos siguientes formatos: La parte entera y la parte fraccionaria separadas por un punto “.”. En este caso, tanto la parte entera como la parte fraccionaria son números naturales con la notación matemática habitual. Notación base-exponente en la que se separan ambas partes mediante el símbolo “e”. En este caso la base es un número natural con la notación matemática habitual pero el exponente es un número entero que podría estar precedido de manera opcional por el signo menos “-“ (en el caso de ser negativo) A continuación se muestran ejemplos de estas constantes 1.2 34.1 1234e2 1234e-1 Constantes que representan puntos tanto de dos dimensiones como de tres. Se representan de manera funcional con la palabra punto seguida, entre paréntesis, por los valores reales de las coordenadas separadas por el símbolo punto y coma “;”. A continuación se muestran ejemplos de estas constantes punto(1.2;1234e-1) punto(1.2;34.1;1234e1) Constantes que representan polígonos. Con una notación funcional similar a los puntos, con la palabra polígono seguida, entre paréntesis, por los puntos que definen sus vértices separados mediante el símbolo punto y coma “;”. No se permite mezclar puntos de diferente dimensión en el mismo polígono y el número de vértices tiene que ser mayor o igual que 1. poligono(punto(1.2;1234e-1);punto(1e2;1234.1)) Se pide diseñar un conjunto de expresiones regulares que identifique los siguientes elementos (para su comodidad puede utilizar la notación de flex; en otro caso especifique previamente la notación que va a utilizar para cada operador de las expresiones regulares): Las constantes de tipo real. Las constantes que representen puntos. Las constantes que representen polígonos. 8.1. (0,6 puntos)¿A qué técnica de análisis ascendente no puede corresponder la siguiente tabla de análisis? ¿Por qué? T d e 0 1 2 d3 3 4 5 d8 d7 6 7 8 9 10 d7 11 Acción b ; d2 f $ N B D E 1 acc 4 r2 d5 6 d9 d10 r4 r3 r1 11 r5 Ir_a 8.2. (0,7 puntos) Para las parejas de estados que considere que pueden unificarse según el algoritmo LALR visto en clase, modifique en el estado de la derecha lo que considere oportuno para realizar esa unificación. Recuerde que en la notación AA+ {$} el punto indica una posición en la parte derecha de la regla por lo que este ejemplo sería equivalente a la configuración (x,2,{$}), donde x indica un número de regla. Nótese que para este ejercicio conocer el valor de dicho número no afecta a la solución. a) b) c) 8.3. (0,7 puntos) Considere la gramática que contiene el subconjunto de reglas que se muestra a continuación: ··· Q(E+E) EE*E E(E) Ei ··· SS;S SA Ai ··· Se desea realizar un analizador sintáctico ascendente con la técnica LR(1). Complete los dos estados del siguiente fragmento de analizador sintáctico LR(1): 9. Dado el siguiente fragmento de código for (j=1; j<50; j=j+2;) { ··· k= ( … d+j*f… ) ··· } Donde se puede considerar que d y f son invariantes del bucle. Responda razonadamente las preguntas que se le plantean a continuación: Suponga que en el grupo de cuádruplas que aparecerán a continuación La etiqueta INIT, se refiere a la parte de inicialización del bucle. La etiqueta LOOP, indica el principio del cuerpo del bucle. La etiqueta INCR, se refiere a las cuádruplas en las que se realizan los incrementos de las variables del bucle. a) (0,2 puntos) Considere el siguiente conjunto de cuádruplas que podría obtenerse al procesar el fragmento de código anterior: INIT:(=, LOOP:··· (*, (+, ··· INCR:(+, 1, , j) j, t1, f, d, t1) t2) j, 2, j) ¿Cuál es la variable del bucle ? ¿Cuál es el incremento del bucle? b) (0,4 puntos) Tomando como punto de partida el conjunto de cuádruplas del apartado a) ¿Cuál es el conjunto de cuádruplas resultante al aplicar el algoritmo para la optimización de reducción de fuerza en bucles contenido en el temario de la asignatura a la cuádrupla (*,j,f,t1)? c) (0,4 puntos) Considere el siguiente conjunto de cuádruplas: INIT:(=, LOOP:··· (+, (*, ··· INCR:(+, 1, , j) t1, j, d, f, t2) t1) j, 2, j) ¿Cuál es el conjunto de cuádruplas resultante al aplicar el algoritmo para la optimización de reducción de fuerza en bucles contenido en el temario de la asignatura a la cuádrupla (+,t1,d,t2)? SOLUCIONES 1. N v=37 b=10 DS v=8 b=8 DS v=37 b=8 DS v=4 dig v=8 ‘#’ dig v=4 dig v=5 2. # # digit NUM DS DS1 > > = 3. 1. (:=, 0, , i) 2. (:=, 10, , b) 3. (:=, 5, , c) 4. (<, i, 10, t1) 5. (+, i, 1, i) 6. (jfalse, t1, 13, ) 7. (!=, c, i, t2) 8. (jfalse, t2, 12, ) 9. (-, c, i, t3) 10. (/, b, t3, t4) 11. (:=, t4, , d) 12. (jmp, 4, , ) 13. 4.a) (1) Serie ::= { Lista } (2) Lista ::= NUM FinLista (3) FinLista ::= , NUM FinLista (4) | digit < > = NUM DS < DS1 = 4.b) Serie Lista FinLista { { Lista } NUM } , $ NUM FinLista , NUM FinLista 5. 5 3 Dirección retorno BP BP antiguo 7 4 7 SP 6. a) Una tabla de símbolos es un conjunto de pares clave-valor b) En la TS se almacena toda la información referente a variables del programa: tipo, número de dimensiones (si se trata de un array), número y tipo de argumentos (si se trata de una función), etc. c) Las operaciones que se realizan sobre una tabla de símbolos son: búsqueda, inserción, cambio de valor d) Cuando se procesa una declaración se realiza primero una búsqueda para comprobar que el identificador no ha sido previamente declarado, y una inserción Cuando se procesa una instrucción ejecutable se realiza una búsqueda para comprobar que el identificador se ha declarado previamente La operación de cambio de valor puede utilizarse por ejemplo, cuando localizamos la etiqueta correspondiente a un GOTO que se había procesado previamente. En ese momento podemos modificar el atributo dirección_salto del identificador correspondiente a la etiqueta. 7. Constantes de tipo real. DIGITO [0-9] ENTERO {DIGITO}+ REAL1 {ENTERO}"."{ENTERO} REAL2 {ENTERO}e{ENTERO}|{ENTERO}e”-“{ENTERO} REAL {REAL1}|{REAL2} Constantes que representen puntos. PUNTO2D punto"("{REAL}";"{REAL}")" PUNTO3D punto"("{REAL}";"{REAL}";"{REAL}")" Constantes que representen polígonos. POLIGONO2D poligono"("{PUNTO2D}(";"{PUNTO2D})*")" POLIGONO3D poligono"("{PUNTO3D}(";"{PUNTO3D})*")" 8.1. No puede ser LR(0) porque faltan reducciones en todas las casillas de la misma fila (en la parte azul) 8.2. Sólo se puede unificar el que se muestra: 8.3 Q(E+E) {$,i} Q(E+E) {$,i} EE*E {),*} E(E) {),*} Ei {),*} ; SS;S {$} SS;S {$} SS;S {$,;} SA {$,;} Ai {$,;} 9.a) La variable del bucle es j y el incremento 2. 9.b) En la cuádrupla (*,j,f,t1) la variable del bucle es j con incremento 2 y la invariante del bucle es f por lo tanto se puede eliminar la cuádrupla y Pasar a la parte INIT: ya que el incremento es 2 y t3 es una variable temporal nueva. (*,j,f,t1) (*,2,f,t3) Pasar a la parte INCR: ya que la variable que contiene el resultado de la cuádrupla optimizada es t1 y t3 es la variable temporal nueva creada en la optimización. (+,t1,t2,t1) El resultado es INIT:(=, (*, (*, LOOP:··· (+, ··· INCR:(+, (+, 1, j, 2, , f, f, j) t1) t3) t1, d, t2) j, t1, 2, t3, j) t1) 9.c) En este caso la cuádrupla (+,t1,d,t2) no tiene la estructura necesaria para la optimización (+,variable_bucle, invariante_bucle, variable) ya que aunque d es invariante del bucle, t1 no es la variable del bucle (lo es j).