COMPILADORES - Departamento de Lenguajes y...
Transcript of COMPILADORES - Departamento de Lenguajes y...
CCOOMMPPIILLAADDOORREESS Segundo parcial, 21 de junio de 2004
Observaciones: 1. La fecha estimada de publicación de las calificaciones es el 6 de julio. 2. La fecha estimada de la revisión es el 8 de julio. 3. En la Web (http://www-lt.ls.fi.upm.es/compiladores) se avisará de la
fecha exacta de la publicación de las calificaciones, así como la fecha y hora definitiva de la revisión.
4. La duración de este examen será de 2 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los tres ejercicios tienen la misma puntuación.
1. De un lenguaje con paso de parámetros por valor y que no realiza conversiones de tipos, se ha obtenido el fragmento de gramática siguiente:
P D P | S P | λ D function id (L): T; begin P end | T id; L T: id | L; L T integer | real S id:= E; E id (A) | id A E | A, A
Se pide construir un Esquema de Traducción para realizar el Análisis Semántico, detallando todos los accesos a las Tablas de Símbolos (incluyendo su creación y destrucción) y teniendo en cuenta que el Analizador Léxico no introduce absolutamente nada en la Tabla de Símbolos. Explicar los atributos y funciones utilizadas.
2. Dado el fragmento de gramática siguiente:
S A | B | F | call id(L); | S S A id= id; | id = (id + id); B repeat M until E > 0; F procedure id (L) {M}; L L, id | id M M A | A E id | (E)
Se pide construir un Esquema de Traducción que genere código intermedio de tres direcciones, teniendo en cuenta que el paso de parámetros es por valor. Explicar los atributos y funciones utilizadas.
3. Se tiene el siguiente fragmento de un programa fuente en un lenguaje en el que todas las variables son enteras y tienen que estar declaradas. En la máquina destino, tanto las direcciones como los valores enteros ocupan 4 bytes.
Procedure uno (); Var a; Procedure dos (x); // x por valor Var b; Procedure tres (y, ref z); // y por valor, z por referencia Var c; Begin // tres c:= 9; y:= c + y; z:= c + b; // End; Procedure cuatro (x); // x por valor Var d; Begin // cuatro b:= x; If x <= 4 Then d:= a; Else cuatro (x – 1); End; Begin // dos b:= 7; x:= x + b; cuatro (a); tres (x, a); End; Begin // uno a:=5; dos (a); End;
Se pide:
a. Realizar una traza de ejecución de este fragmento de programa, dando el diseño del Registro de Activación y la pila detallada. Supóngase que todos los temporales van en el Registro de Activación.
b. Para la sentencia marcada con : b.1. Detallar el código objeto que se generaría, sin usar el nombre simbólico de las
variables sino sus direcciones reales. b.2. ¿Cómo ha podido saber el Generador de Código establecer la dirección para b? b.3. Si la sentencia hubiera sido z:= c + d, ¿qué habría pasado? Explicar en detalle,
comentando los módulos implicados.
c. Escribir detalladamente (no de forma genérica) toda la información que recibe como entrada el Generador de Código Objeto durante el tiempo en que dicho generador está procesando el procedimiento cuatro, especificando todas y cada una de las entradas de datos al módulo.
CCOOMMPPIILLAADDOORREESS Primer parcial, 21 de junio de 2004
Observaciones: 1. La fecha estimada de publicación de las calificaciones es el 6 de julio. 2. La fecha estimada de la revisión es el 8 de julio. 3. La duración de este examen será de 2 horas. 4. Cada ejercicio deberá entregarse en hojas separadas.
1. Un fragmento de un lenguaje dispone de los siguientes elementos:
• Identificadores: empiezan con una letra que puede ir seguida de letras o dígitos. Longitud máxima de un identificador: 6 caracteres
• Números enteros • Números reales, siendo opcional la parte entera • Operadores lógicos: .AND., .OR., .NOT. • Operadores relacionales: .GT., .LT., .EQ., .NE., .GE., .LE. • Palabras reservadas: INTEGER, LOGICAL, IF, ENDIF, THEN, ELSE, WHILE, FOR...
Se pide diseñar un Analizador Léxico (gramática, tokens y autómata con acciones semánticas) que introduzca toda la información posible en la Tabla de Símbolos.
(3.5 puntos)
2. Dado el siguiente fragmento de una gramática de un lenguaje de programación que representa sus sentencias:
S A | C | P A id:= E C if R then S | if R then S else S P print (L) | print (L) path L L, E | E E id | id + E | (E) R E > E | E = E
Se quiere construir una gramática LL(1) que genere el mismo lenguaje:
a. ¿Qué problema nos encontramos a la hora de intentar construir dicha gramática?
b. Eliminando una de sus reglas, transformar la gramática resultante en una gramática LL(1). Detallar todos los cálculos necesarios para comprobar las condiciones LL(1).
(3 puntos)
3. Sea la gramática:
E T R R + T R | * T R | λ T id
a. ¿Con cuáles de las siguientes gramáticas puede trabajar un Analizador Sintáctico LR y con cuáles no?
Gramática recursiva por la izquierda Gramática recursiva por la derecha Gramática ambigua Gramática con reglas lambda Gramática con dos o más reglas con la misma parte derecha (ejemplo: E T+F y T T+F)
Gramática con dos o más reglas para una misma metanoción cuyos consecuentes tienen intersección no vacía de FIRST
b. ¿Cuándo se dice que una gramática es ambigua? (Contestar brevemente en menos de 10 líneas.)
c. Construir el autómata de un SLR para la gramática dada, modificándola previamente si fuera necesario.
d. Describir los pasos que sigue el analizador hasta llegar a la forma sentencial T R para una cadena de entrada cualquiera que tenga exactamente dos identificadores.
(3.5 puntos)
CCOOMMPPIILLAADDOORREESS Examen Final, 9 de septiembre de 2004
1. En la Web (http://www-lt.ls.fi.upm.es/compiladores) se avisará de la fecha exacta de la publicación de las calificaciones (fecha tope: 23‐septiembre‐2004), así como la fecha y hora definitiva de la revisión (dos días después).
2. La duración de este examen será de 3 horas. 3. Cada ejercicio deberá entregarse en hojas separadas. 4. Los dos ejercicios tienen la misma puntuación.
1. De un lenguaje con paso de parámetros por referencia y que no realiza conversiones de tipos, se tiene el fragmento de gramática siguiente:
P’ P P D P | F P | λ D T id; F function id (L): T; begin B end L T: id | L, L
T integer | real B D B | S B | λ S id:= E; | return E; E id (A) | id A E | A, A
Se pide construir un Esquema de Traducción para realizar el Análisis Semántico y la Generación de Código de tres Direcciones, detallando todos los accesos a las Tablas de Símbolos (incluyendo su creación y destrucción) y teniendo en cuenta que el Analizador Léxico no introduce absolutamente nada en la Tabla de Símbolos. Explicar los atributos y funciones utilizadas.
2. Sea la siguiente gramática que representa un fragmento de un lenguaje, del cual se muestra también un programa de ejemplo:
P D begin S end D const L L I = N ; L | I = N | λ N d+ . d+ S I := E | I := E ; S I l (l | d)* E E + (E) | N | I
const max= 30.03; min= 3.5 begin cant:= 17.0; valor:= max +(min + (cant)); total:= valor + (valor) end
El lenguaje tiene las siguientes características:
• No hay declaraciones, salvo para los identificadores de tipo constante. • La longitud máxima de los identificadores es de 8 caracteres.
Para este fragmento de lenguaje, se pide:
a. Diseñar la Tabla de Símbolos (TS) completa (con todos los campos).
b. Construir el autómata y las acciones semánticas de un Analizador Léxico, considerando que uno de los tokens es: <ID, posiciónTS>.
c. Rellenar la TS con lo que almacena el Analizador Léxico para el programa del ejemplo.
d. Construir parcialmente el AFD reconocedor de prefijos viables correspondiente a un SLR, exceptuando la rama formada por todos los estados surgidos a partir de goto (I0, begin). Comprobar si en alguno de los estados obtenidos hay algún conflicto reducción/desplazamiento.
e. Rellenar la TS con lo que almacena el Analizador Sintáctico para el programa del ejemplo.
CCOOMMPPIILLAADDOORREESS Examen final. Segundo parcial. 10 de febrero de 2005
Observaciones: 1. Las calificaciones del examen final se publicarán antes del 21‐2‐05 y la fecha estimada de la revisión será un mínimo de 48 horas después. Las fechas y horas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
3. La duración de este examen será de 2 horas. 4. Cada ejercicio deberá entregarse en hojas separadas. 5. Ambos ejercicios tienen la misma puntuación.
1. Sea la siguiente gramática BNF de un fragmento de un determinado lenguaje:
S id:= E E E1 / E2 | E1 DIV E2 | id | núm_ent | núm_real
Se pide construir un Esquema de Traducción para realizar el Análisis Semántico y la Generación de Código Intermedio de tres direcciones (explicando brevemente todos los atributos y funciones utilizadas), teniendo en cuenta que:
• El lenguaje sólo dispone de los tipos entero y real. • El lenguaje permite la conversión automática de tipos, tanto de entero a real, como de real
a entero. • El operador / es la división real: sus operandos pueden ser enteros o reales y su resultado
es real. • El operador DIV es la división entera: sus operandos pueden ser enteros o reales y su
resultado es entero. • Las variables tienen que estar declaradas obligatoriamente antes de su uso. • El código intermedio a generar solamente dispone de un tipo de división: ambos operandos
deben ser reales y el resultado devuelto es un valor real.
2. Se tiene un lenguaje que dispone de anidamiento de funciones y procedimientos y en el que el paso de parámetros es siempre por valor. Se pide dibujar, con el mayor detalle posible, la traza de ejecución del programa siguiente.
Program principal; Var x, y: integer;
Function cantidad (x, y: integer): integer; begin return x + y end; Function sumatorio (x: integer): integer; begin y:= x; if (x<0) then write (“El parámetro no debe ser negativo”) else if (x=0) then return 1 else return x + sumatorio (x-1) end;
begin (*principal*) y:= cantidad (1,1); x:= sumatorio (cantidad (1,1)); write (“El resultado es ”, x) end (*principal*).
CCOOMMPPIILLAADDOORREESS Examen del primer parcial. 10 de febrero de 2005
Observaciones: 1. Las calificaciones del primer parcial se publicarán a mediados de marzo. Cuando estén, se avisará en http://www-lt.ls.fi.upm.es/compiladores
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas. 4. Las dos preguntas tienen la misma puntuación.
1. La grámatica siguiente es un subconjunto de la grámatica del lenguaje LISP para la definición de funciones:
F ( id L ) L D A | D A R A λ | D A R rest A D ( id e )
Se pide:
a. En la hoja de respuesta adjunta, completar la plantilla del Autómata Reconocedor de Prefijos Viables (correspondiente al método de Análisis Sintáctico Ascendente SLR), rellenando los subconjuntos de items y etiquetando las transiciones entre ellos. Téngase en cuenta que la plantilla tiene un número reducido de errores (faltan o sobran estados o transiciones).
b. En el autómata anterior, analizar los estados en que se pueden producir conflictos al construir el analizador.
c. Comprobar si la gramática dada es LL(1) (válida para un analizardor descendente). Si no lo fuera, transformala para conseguir una gramática que cumpla las condiciones LL(1).
2. En un aeropuerto se dispone de un fichero con la siguiente información relativa a compañía aérea, destino y puerta de embarque correspondiente a cada vuelo:
• El nombre de la compañía aparece completo, como una cadena de letras (que puede contener blancos).
• Como destino aparece el código del aeropuerto de destino (secuencia de tres letras mayúsculas) o bien el nombre completo de la ciudad de destino (cadena de letras que puede contener blancos).
• La puerta de embarque viene dada por una secuencia de dígitos (cuatro dígitos como máximo y uno como mínimo) y el primero de ellos nunca puede ser un cero.
Estos campos se separan entre sí mediante uno o varios saltos de línea. Todos los nombres de las compañías, aeropuertos y ciudades se encuentran predefinidos.
Se quiere comprobar que los datos de entrada son correctos y obtener como salida la misma información pero con ligeras modificaciones en cuanto a su codificación:
• El nombre de la compañía se sustituirá por el código de ésta (formado por dos letras).
• El destino se representará en todos los casos mediante el nombre completo de la ciudad.
• En cuanto a la puerta de embarque, los dos últimos dígitos de la cadena (el último, si la cadena es de longitud uno) dan el número de la puerta. El primero o los dos primeros dígitos (si la cadena es de longitud tres o cuatro, respectivamente) dan la zona a la que pertenece la puerta. Las zonas se representan usando una letra de la A a la Z (A=1, B=2...). Véase el ejemplo.
Ejemplo: Entrada Salida
IBERIA MAD 231 British Airways 2222 San Francisco Spanair Málaga 7 Zambian Express Airways PTF 99 Aerolíneas Argentinas 2600
IB Madrid B31 BA V22 San Francisco JK Málaga 7 OQ Malololailai 99 AR Z00
El Departamento de Informática del aeropuerto encargado de construir este sistema, ha decidido hacerlo empleando la teoría de Compiladores. Se pide diseñar únicamente la parte del sistema correspondiente al Analizador Léxico del lenguaje descrito (gramática, tokens, AFD y acciones semánticas).
Co
mp
ila
do
res
Co
mp
ila
do
res
1er
Parc
ial, f
ebre
ro-0
5,
Eje
rcic
io 1
.aH
oja
de
Res
pues
ta
I 1I 2
I 3
I 4
I 5I 0
I 6I 10
I 9
I 8
I 7
id
I 11
I 12
rest
I 13
I 15
I 16
I 17 re
st
L
A
D
Nom
bre:
.....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
.....
Ape
llidos
: ....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
....
CCOOMMPPIILLAADDOORREESS Segundo parcial, 20 de junio de 2005
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 7 de julio. 2. Fecha estimada de la revisión: 11 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 1 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S id := E | if not E then S1 E id | E1 between E2 and E3
Se pide diseñar un Esquema de Traducción con el Analizador Semántico y el Generador de Código Intermedio teniendo en cuenta que: • La expresión between se evalúa como cierta si el valor numérico de E1 se encuentra entre los
valores de E2 y E3, ambos inclusive. • El lenguaje tiene variables enteras, carácter y lógicas y se exige su declaración. • El lenguaje no realiza conversiones automáticas de tipos. • Los valores lógicos tienen que representarse por control de flujo. • Deben explicarse brevemente los atributos y funciones utilizadas.
(6 puntos)
2. Se tiene el siguiente fragmento de un programa fuente: ... Procedure magic Integer: d, x, y, z {variables locales del procedimiento magic} Integer: Function cálculo (Integer: x, y) {x,y: parámetros por referencia} a {variable local de la función} Integer: Procedure operación (Integer: x, y) {x,y: parámetros por referencia} Begin operación a:= x * d + y z:= y * d + x End operación Begin cálculo If (x = y) Then magic Else Begin d:= 10 operación (x, y) a:= a – z x:= a / d {división con resultado entero truncado (ejemplo: 7/4=1)} y:= a – x * d operación (y, x) eturn z + a R End End cálculo Begin magic Write ‘Escribe dos dígitos distintos: ’ {impresión por pantalla} x:= ReadDigit {lectura de un dígito por el teclado} y:= ReadDigit Write ‘Resultado: ’ If (x > y) Then Write cálculo (x, y) End magic
Else Write cálculo (y, x)
...
Teniendo en cuenta que un entero ocupa 2 bytes y una dirección 4, se pide: a. Diseñar un Registro de Activación para este lenguaje. b. Realizar una traza de ejecución detallada de este fragmento de programa, representando todo
el contenido de la memoria. ¿Qué se imprime por pantalla? (4 puntos)
CCOOMMPPIILLAADDOORREESS Primer parcial, 20 de junio de 2005
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 7 de julio. 2. Fecha estimada de la revisión: 11 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 1 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. Dado el siguiente fragmento de una gramática de un lenguaje de programación:
Sent SAsig | SDesde | SMientras SMientras mientras Cond hacer Cuerpo fin Cuerpo Sent Cuerpo | λ SAsig id := id SDesde desde id := núm hasta núm Cuerpo fin Cond id <= núm | id < núm
Se pide: a. Comprobar si es LL(1) y, en caso negativo, modificarla para que lo sea. b. Diseñar un Analizador Sintáctico Descendente Predictivo Recursivo. Se deberá
utilizar el procedimiento auxiliar que se define a continuación (aunque provoque alguna redundancia), para la operación de comparación con el token actual y solicitud del siguiente:
Procedure equipara_token (tok: token) Begin If preanálisis = tok Then preanálisis:= scan() Else error (tok) End
c. Diseñar los tokens que enviaría un Analizador Léxico a este Analizador Sintáctico para este fragmento de lenguaje.
2. Dado el siguiente fragmento de una gramática de un lenguaje de programación:
A D ; S D D ; D D id integer D λ E id E núm S S ; S S id := E S λ
Se pide: a. Contruir el Autómata Finito Determinista reconocedor de los prefijos viables en la
hoja de respuesta adjunta (la plantilla puede tener errores u omisiones). b. A partir del AFD, y sin construir la tabla, comprobar si la gramática es o no SLR (1). En
caso de que lo sea, construir las columnas de la tabla correspondientes a id y núm. En caso de que no sea SLR (1), detallar todos los conflictos que aparecen.
c. Explicar, para este gramática, qué información introducen en la Tabla de Símbolos los Analizadores Léxico y Sintáctico.
Co
mp
ila
do
res
Co
mp
ila
do
res
1er
Parc
ial, junio
-05,
Eje
rcic
io 2
.aH
oja
de
Res
pues
ta
I 0
Ape
llidos
: ....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
....
Nom
bre:
.....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
.....
;
S
inte
ger
:=
id
núm
S
λ
D
núm
CCOOMMPPIILLAADDOORREESS Examen final, 7 de septiembre de 2005
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 19 de septiembre. 2. Fecha estimada de la revisión: 22 de septiembre. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 2 horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. Dada la siguiente gramática en notación BNF:
S ( E ) S id E E + S E - S !
Se pide:
a. Contruir la tabla de Precedencia de Operador para dicha gramática.
b. Analizar la cadena: ( - id ! + ( - id ! + id ) )
c. Añadiendo la producción S id + id, la gramática resultante ¿sería de Precedencia de Operador? ¿Por qué?
(4 puntos)
2. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S id := E | if E = false then S1 E id | E1 between E2 and E3
Se pide diseñar una Definición Dirigida por la Sintaxis con el Analizador Semántico y el Generador de Código Intermedio teniendo en cuenta que:
• El lenguaje tiene variables enteras, reales y lógicas y se exige su declaración.
• La expresión between se evalúa como cierta si el valor de E1 se encuentra entre los valores de E2 y E3, ambos inclusive. La operación puede realizarse entre expresiones de cualquiera de los tres tipos disponibles, siempre que las tres expresiones sean del mismo tipo.
• El lenguaje realiza conversiones automáticas de tipos en todos los casos excepto en la expresión between.
• Los valores lógicos tienen que representarse numéricamente (0 es falso y cualquier otro valor es verdadero).
• Deben explicarse brevemente los atributos y funciones utilizadas. (6 puntos)
CCOOMMPPIILLAADDOORREESS Examen del primer parcial. 8 de febrero de 2006
Observaciones: 1. Las calificaciones del primer parcial se publicarán aproximadamente en un mes. Se avisará en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2¼ horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. Un sistema de gestión de una tienda lee de un fichero de texto los nuevos productos que entran en el almacén. Dicho fichero tiene la siguiente estructura: • Número de unidades de cada producto: entero. • Descripción, que puede incluir el nombre, la marca y el modelo del producto: una o varias cadenas de caracteres encerradas entre comillas.
• Precio: número (con dos, uno o ningún decimal) seguido inmediatamente de la unidad monetaria según el formato internacional de moneda de tres letras mayúsculas definido por el estándar ISO 4217. Para comprobar los 178 códigos válidos, así como el cambio oficial del día, se tiene una tabla similar a la siguiente (se muestran también ejemplos de precios válidos):
Moneda Código Cambio oficial Ejemplos Euro EUR 1 20,21EUR
Dólar estadounidense USD 1, 21127 24,48USD
Peso colombiano COP 2748,74 55555COP
Libra esterlina GBP 0, 687366 13,9GBP
... ... ... ...
Teniendo en cuenta que los distintos elementos del fichero fuente tienen que ir separados obligatoriamente por uno o más blancos o saltos de línea y que la tienda quiere tener todos sus precios en euros, se pide diseñar un Analizador Léxico para este lenguaje (gramática regular, tokens completos, autómata finito determinista y acciones semánticas).
(4 puntos)
2. Sea la gramática G1≡(N, T, P1, S), donde N≡{S, A, B, C}, T={*, +, -}, siendo P1: S A B C A λ | A * B C B |+ C - Se pide (siguiendo para las tablas el orden dado de los elementos de los conjuntos N y T): a. Construir el Autómata Reconocedor de Prefijos Viables. b. Estudiar los posibles conflictos a la hora de generar un Analizador LR para esta gramática G1. c. Justificar si la gramática G1 es LL(1). En caso negativo, transformarla para que lo sea. d. Construir la Tabla del Analizador Descendente LL para la gramática del apartado c. e. Justificar si la gramática G1 es de Precedencia de Operador. f. Sea la gramática G2≡(N, T, P2, S), siendo P2: S A * B A * B B + C - | + C - construir la Tabla de Precedencia de Operador y justificar si la nueva gramática G2 es o no de Precedencia de Operador.
(6 puntos)
CCOOMMPPIILLAADDOORREESS Examen final. Segundo parcial. 8 de febrero de 2006
Observaciones: 1. Fecha estimada de publicación de las notas del examen final: 22‐2‐06. Se avisará en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 1½ horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. De una gramática se han entresacado las siguientes reglas: S id := E E E and E | id | true | false
Teniendo en cuenta que las variables pueden ser enteras, reales y lógicas y que no existe conversión automática de tipos, se pide: a. Construir una Definición Dirigida por la Sintaxis para realizar el Análisis Semántico
y la Generación de Código Intermedio, realizando una representación de los valores lógicos mediante control de flujo.
b. Construir una Definición Dirigida por la Sintaxis para realizar la Generación de Código Intermedio, realizando una representación numérica de los valores lógicos.
c. Explicar brevemente los atributos y las funciones utilizadas en ambas Definiciones. (6 puntos)
2. Supóngase que: • en tiempo de ejecución se dispone tanto de memoria estática como dinámica • la pila crece hacia abajo (incrementando las direcciones) • la primera posición del registro de activación (la de dirección más baja) se reserva para almacenar la dirección de retorno.
a. ¿Qué estrategias diferentes existen para asignar memoria a los Registros de Activación en tiempo de ejecución?
b. ¿En función de qué se decide cuál va a ser la estrategia utilizada? ¿En qué momento hay que tomar esta decisión?
c. Escriba, para cada una de las estrategias de asignación de memoria a Registros de Activación posibles, la instrucción (o secuencia de instrucciones) en código objeto (ensamblador) mediante la que se salva la dirección de retorno.
d. Suponiendo que tanto los parámetros (P) como el valor devuelto (VD) se van a llevar a memoria, se proponen cuatro diseños diferentes para esa parte del Registro de Activación:
VD VD P1 P1 P1 Pn P2 … P2 ... … VD ↓ … P2 Pn …
Pn P1 VD Pn Explique las ventajas e inconvenientes de cada uno de ellos.
e. Se plantean aquí dos diseños diferentes para una parte del Registro de Activación: Parám. Dir. Ret.
Dir. Ret. Parám. VD Var. Locales
Var. Locales VD Explique si hay alguna diferencia en la información contenida en la Tabla de Símbolos que habría que tener para el primer diseño respecto a la del segundo o si, por el contrario, la tabla de símbolos es igual independientemente de cuál sea el diseño de Registro de Activación elegido.
(4 puntos)
CCOOMMPPIILLAADDOORREESS Segundo parcial, 19 de junio de 2006
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 27 de junio. 2. Fecha estimada de la revisión: 29 de junio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 1 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. De un lenguaje se ha extraído el siguiente fragmento de gramática:
E → id | not E | E nand E
Se pide diseñar el Generador de Código Intermedio construyendo dos Esquemas de Traducción representando los valores lógicos numéricamente en el primero y por control de flujo en el segundo. Téngase en cuenta que: • El operador nand devuelve cierto sólo si alguno de sus operandos es falso. • El lenguaje intermedio a utilizar (código de 3 direcciones) no dispone de operadores lógicos. • Deben explicarse brevemente los atributos y funciones utilizadas.
2. Sea el siguiente fragmento de un programa: procedure f var z function ) g (x procedure a begin (*a*) z:= 18.1 end (*a*) function h (x,y) var p procedure k var x begin (*k*) x:= 5 end (*k*) procedure i (x) procedure j (x,y) var z begin (*j*) p:= x+y end (*j*) begin (*i*) if (x>11) call i(x-1) call j(g(5),p) z:= p end (*i*) begin (*h*) p:= x+y call i(p) return p end (*h*) procedure c begin (*c*) z:= h(5,7)+1 begin (*g*)
end (*c*)
if (x>6) call c return x*x begin (*f*)
end (*g*)
write g(7), z end (*f*)
Se pide realizar una traza de ejecución detallada del fragmento de programa, representando todo el contenido de la memoria.
El compilador y el lenguaje tienen las siguientes características:
• Cada sentencia del lenguaje va escrita en una única línea
• El compilador no realiza ninguna optimización
• El lenguaje tiene estructura de bloques
• El modo de paso de los parámetros es por valor
• Existen conversiones automáticas de tipos
• Las direcciones ocupan 4 bytes
• Las expresiones lógicas se tratan por control de flujo
• Las funciones devuelven siempre un valor entero
• Los enteros ocupan 2 bytes
• Todas las variables son de tipo entero
• Todos los parámetros son de tipo entero
• Todo identificador debe estar declarado antes de su uso
COOMPPILLADDOORREESS Primer parcial, 19 de junio de 2006
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 27 de junio. 2. Fecha estimada de la revisión: 29 de junio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 1 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. Un fichero almacena nombres, apellidos y números de DNI, separados entre sí por saltos de línea. Los elementos tienen las siguientes características:
• Nombres: Pueden estar formados de dos maneras: (1) compuestos por una sola palabra; (2) compuestos por una palabra seguida de un espacio, una inicial y un punto.
• Apellidos: Están compuestos de dos palabras separadas por un blanco. • Palabras: Están formadas por letras, pudiendo contener en su interior un único guión
que en ningún caso puede aparecer al principio o al final de la palabra. • DNI: Está compuesto por una secuencia no vacía de dígitos seguida de una letra. En
España se han emitido 60.000.000 de números de DNI. Para obtener la letra que corresponde a un DNI se calcula el módulo del valor entero del DNI entre 23 y el número obtenido es el índice para consultar el siguiente vector que da la letra correcta:
Índice 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22Letra T R W A G M Y F P D X B N J Z S Q V H L C K E
Se pide diseñar un Analizador Léxico para este lenguaje (gramática, tokens, autómata y acciones) que permita determinar los nombres, apellidos y DNI correctos.
2. Sea la siguiente gramática:
F → ( id A ) A → P O R O → P O | null R → rest O | λ P → ( id O )
Se pide:
a. Utilizando el orden de no terminales {F, A, O, R, P} y de terminales {(, id, ), rest, null}, construir la tabla del Analizador Sintáctico LL para esta gramática.
b. Realizar el análisis sintáctico LL para la cadena: (id (id null) null)
c. Si se añade la regla P → λ, demostrar, sin rehacer la tabla, si esta gramática es LL o no. d. Determinar las relaciones de Precedencia de Operador entre las siguientes parejas de
símbolos (*, **), (**, *), (**, id) e (id, núm), que se puedan obtener del siguiente fragmento de gramática:
E → A * B B → B ** A A → id | núm | E
CCOOMMPPIILLAADDOORREESS Examen del primer parcial. 9 de febrero de 2007
Observaciones: 1. Las calificaciones del primer parcial se publicarán aproximadamente a mediados de marzo. Se avisará en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. Se tiene un lenguaje con las siguientes características:
• Los números pueden llevar parte decimal o no; en caso de llevar parte decimal, ésta va separada con una coma. Tanto la parte entera como la decimal (si existe) ha de tener al menos un dígito.
• Los números pueden llevar puntos de millar (sólo en la parte entera) cada tres dígitos para facilitar su lectura. En caso de que el número se haya escrito con puntos, tendrán que estar todos los puntos posibles. Por tanto, son correctos los números 7234234 y 1.123.456,5679, pero no el número 7234.234 (falta un punto entre el 7 y el 2) ni el número 123.45 (tiene mal colocado el punto).
• Se pueden realizar operaciones aritméticas sobre números del mismo tipo. Las operaciones posibles son la suma, resta, multiplicación, división y menos unario.
Se pide diseñar un Analizador Léxico (tokens completos, gramática regular, autómata finito determinista y acciones semánticas) para este lenguaje.
(4.5 puntos)
2. a. Un lenguaje dispone de tres variantes para la sentencia perform:
perform CUERPO EXP times perform CUERPO until CONDICIÓN perform CUERPO varying id from EXP by EXP until CONDICIÓN
Se pide escribir una gramática capaz de generar estos tres tipos de sentencias exclusivamente, adaptándola a las necesidades de un Analizador Descendente y construir el Analizador Predictivo Recursivo correspondiente. Considerar como no terminales las palabras en mayúsculas (CUERPO, EXP y CONDICIÓN) pero sin escribir las reglas de la gramática correspondiente a dichos símbolos ni desarrollar esa parte del analizador.
b. Sea la siguiente gramática:
S P c E | P c id E begin E end | sent | λ P begin D end D id tipo D | λ
Se pide construir el autómata reconocedor de prefijos viables (utilizando la hoja de respuesta adjunta, que puede tener errores) y estudiar la existencia de conflictos en los estados con 4 ó más items.
(5.5 puntos)
CCOOMMPPIILLAADDOORREESS Examen final. Segundo parcial. 9 de febrero de 2007
Observaciones: 1. Se estima que se publicarán las notas del examen final a partir del 16 de febrero, siendo la revisión al menos 2 días después. Las fechas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. De una gramática se han entresacado las siguientes reglas:
S S ; S | call id ( L ) | id := E L E | E , L E E op_arit E | id | entero | real
Teniendo en cuenta que las variables pueden ser enteras o reales, que no existe conversión automática de tipos y que el lenguaje dispone de procedimientos y funciones, se pide: a. Construir una Definición Dirigida por la Sintaxis para realizar el Análisis Semántico
y la Generación de Código Intermedio (tres direcciones). b. Aplicar la Definición construida al siguiente fragmento de programa:
a:= 9.6; call p (5, a – 1.1) (5 puntos)
2. Sea el siguiente fragmento de programa:
Global y= 5 … Procedure main ()
Var x, z Procedure tabla (REF x, REF y, VAL z) // x, y por referencia; z por valor Begin tabla
y= 8 …
End tabla Procedure hoja (VAL y) Var x= 2 Begin hoja
… Call tabla (x, y, z) …
End hoja Begin main
x= y * 2; z= x - 3 Call hoja (x) …
End main
Teniendo en cuenta que un entero ocupa 4 bytes y una dirección 2, se pide indicar, para la instrucción marcada con “ ”: a. El código de tres direcciones que produciría el generador de código intermedio. b. La salida que produciría el generador de código final. c. Detallar el contenido de la memoria desde que se inicia la ejecución hasta el instante
en que se ejecute la sentencia y=8. (5 puntos)
CCOOMMPPIILLAADDOORREESS Segundo parcial, 15 de junio de 2007
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 2 de julio. 2. Fecha estimada de la revisión: 5 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 2 horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S → id := E | while not E do S E → id | E ∈ I | cte | E and E I → [cte, cte]
Se pide diseñar el Analizador Semántico y el Generador de Código Intermedio construyendo un Esquema de Traducción representando los valores lógicos por control de flujo. Téngase en cuenta que: • La expresión E ∈ I devuelve cierto si el valor entero de la expresión E pertenece al intervalo cerrado
I (incluidos los dos extremos del intervalo). • El intervalo I debe tener el primer valor no mayor que el segundo y ambos serán enteros. • Las variables solo pueden ser enteras o lógicas y no hay conversión automática de tipos. • Deben explicarse brevemente los atributos y funciones utilizadas.
2. Sea el siguiente fragmento de un programa escrito en un determinado lenguaje: procedure dos var a, x, c procedure uno (z ref) var b, c procedure cuatro (c val) begin cuatro a:= b + c Call uno (1) end cuatro begin uno c:= 2 b:= c if z>b then Call cuatro (c) end uno procedure tres begin es tr Call uno (c) c:= 5 end tres begin dos c:= 1 Call tres Call uno (c) end dos
El compilador y el lenguaje tienen las siguientes características:
• El compilador no realiza ninguna optimización, lo cual implica que todos los temporales se han de almacenar en memoria
• El lenguaje tiene estructura de bloques con reglas de ámbito léxico y anidamiento
• Las direcciones ocupan 2 bytes • Los enteros ocupan 4 bytes • Los parámetros se pueden pasar por valor (val) o
por referencia (ref) • Todas las variables son de tipo entero.
Se pide:
a. Diseñar un Registro de Activación general para este lenguaje.
b. Realizar una traza de ejecución detallada del fragmento de programa, representando todo el contenido de la memoria.
c. Escribir el código intermedio de 3 direcciones y el código ensamblador (comentado y detallando las direcciones de las variables) que se generaría para la sentencia “a:= b + c” que aparece en el fragmento de programa.
COOMPPILLADDOORREESS Primer parcial, 15 de junio de 2007
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 2 de julio. 2. Fecha estimada de la revisión: 5 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 2 horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. Un fragmento de un lenguaje tiene asignaciones con la siguiente estructura:
S → id := E E → id | cte_entera | cte_hora | E + E
• El nombre de un identificador empieza por una letra seguida, opcionalmente, por dígitos • La constante entera está formada por cualquier cantidad de dígitos • La constante de hora se forma con la hora, los minutos y los segundos separados entre sí por
dos puntos (‘:’). Representa una hora del día (en formato 24 horas) y el compilador necesita, para hacer las operaciones, el número de segundos transcurridos desde la media noche. Cada parte de esta constante debe tener obligatoriamente dos dígitos. Ejemplos: 07:30:59, 23:00:01.
Se pide diseñar un Analizador Léxico para este lenguaje (gramática, tokens, autómata determinista, acciones semánticas y algunos mensajes de error).
(4 puntos)
2. La figura muestra un Autómata Reconocedor de Prefijos Viables de un SLR obtenido a partir de una gramática G1. El autómata no tiene errores, pero está incompleto. A partir del autómata, se pide:
a. Definir la gramática G1 que da lugar a ese autómata (G1 es única teniendo en cuenta los supuestos del enunciado).
b. Completar el autómata (dibujando los estados en la misma posición que se ve en la figura).
Dada la siguiente gramática G2 en notación BNF que representa la declaración de un registro:
S → reg id begin L end L → L ; D | D D → id : integer | id : string
Se pide: c. Transformar esta gramática G2 para que sea LL. d. Definir el conjunto de procedimientos que conforman el Analizador Sintáctico Descendente Recursivo que reconoce el lenguaje definido por esta gramática G2.
(6 puntos)
S’→ ● S S → ● A b C A → ● A → ● b d
A → b ● d
S → A ● b C
S → A b ● C C → ● c C → ● A b C → ● S A → ● A → ● b d S → ● A b C
S → A b C ●
C → A b ● S → A b ● C
C → A ● b S → A ● b C
CCOOMMPPIILAADDOORRESS Examen final, 4 de septiembre de 2007
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 17 de septiembre. 2. Fecha estimada de la revisión: 21 de septiembre. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de publicación
de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 3 horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. Dada la siguiente gramática que representa las características léxicas y sintácticas de un lenguaje:
S F | A | R F for id := N to N do S A id := E R repeat S until C id L M L a | b | … | z | A | B | … | Z M L M | D M | λ N D | D N D 0 | 1 | … | 9 E E + E | E * E | id C id > id
Se pide:
a. Diseñar el Analizador Léxico de un compilador para este lenguaje.
b. Sin modificar las reglas de la gramática, construir la tabla del Analizador Sintáctico de Precedencia de Operador para este lenguaje (justificando cómo se obtienen las relaciones). Explicar si hay o no algún conflicto (casilla con más de una relación) y por qué. En caso de que hubiera conflictos, resolverlos razonadamente sin modificar la gramática.
c. Sólo viendo la gramática, sin construir ningún autómata ni ninguna tabla de analizador, contestar razonadamente a las siguientes preguntas:
1) ¿Se podría construir para dicha gramática un SLR(1)? 2) ¿Se podría construir para dicha gramática un descendente tabular o LL(1)? 3) ¿Se podría construir para dicha gramática un descendente recursivo predictivo?
2. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S id := E | if E then S1
E id | E1 ∈ I | E1 + E2 | C I (C1 , C2) C ent | real | – C1
Se pide diseñar una Definición Dirigida por la Sintaxis con el Analizador Semántico y el Generador de Código Intermedio teniendo en cuenta que: • Deben explicarse brevemente los atributos y funciones utilizadas. • El lenguaje no realiza conversiones automáticas de tipos. • El lenguaje tiene variables enteras, reales y lógicas y se exige su declaración. • El lenguaje sólo permite aplicar el operador + a operandos numéricos. • El intervalo I debe tener el primer valor menor que el segundo y ambos han de ser del mismo
tipo. • La expresión E1 ∈ I devuelve cierto si el valor de la expresión E1 pertenece al intervalo abierto
I (excluidos los dos extremos del intervalo). • Los valores lógicos tienen que representarse numéricamente.
CCOOMPPILLAADOOREES Examen del primer parcial. 12 de febrero de 2008
Observaciones: 1. Las calificaciones del primer parcial se publicarán aproximadamente a mediados de marzo. Se avisará en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2½ horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. La Biblioteca de la Facultad de Informática quiere crear una aplicación para almacenar en su Base de Datos toda la información sobre los Trabajos Fin de Carrera que tiene almacenados en un fichero XML. El formato de los datos en este fichero es el siguiente:
<tfc> <autor>Luis Gómez y Villalonga de Pi</autor> <fecha_nac>18/05/85</fecha_nac> <titulo_tfc>Diseño 3o de un Reconocedor de TFC’s </titulo_tfc> <tutor> Mariam Heras</tutor> <nota>sobresaliente 9</nota>
</tfc>
Deben tenerse en cuenta las siguientes características del formato del fichero:
• El título admite todo tipo de caracteres excepto el signo menor (“<”). El título de un TFC siempre empieza por una letra.
• La nota numérica puede ir de 0 a 10 y puede estar escrita con un decimal. • La nota no numérica será una de las palabras: {“matrícula”, “sobresaliente”,
“notable”, “aprobado”, “suspenso”}. • En un TFC puede aparecer solo un tipo de nota o ambas y, en este caso, en
cualquier orden. • Las etiquetas XML son de dos tipos: de apertura y de cierre. Cada etiqueta contiene
una palabra encerrada entre “<” y “>”; las de cierre llevan, además, el símbolo “/”. • Existe una tabla que contiene todas las palabras clave de las etiquetas XML válidas:
{“tfc”, “autor”, “fecha_nac”…}. Las palabras sólo contienen letras y subrayados. • Las fechas deben tener dos dígitos para el día, dos para el mes y dos para el año, y
debe ser una fecha correcta. En la Base de Datos se almacenará como cadena.
Se pide construir un Analizador Léxico para este lenguaje (tokens, gramática, autómata finito determinista y acciones semánticas).
(5,5 puntos)
2. Sea la siguiente gramática:
S 0 A A 0 | 1 A 1 | λ A B | C B 0 1 | 1 0 C 0 0 | 1 1
Se pide: a. Comprobar las Condiciones LL (1). Si no es LL (1), transformar la gramática para que
lo sea. b. Construir el Analizador Sintáctico Descendente Predictivo Recursivo. c. Construir la tabla del Analizador Sintáctico Descendente LL (1). d. Analizar la cadena “001100” con el Analizador no recursivo. Dibujar su árbol de
análisis sintáctico y dar el análisis o parse correspondiente. (4,5 puntos)
CCOOMPPILLAADOOREES Examen final. Segundo parcial. 12 de febrero de 2008
Observaciones: 1. Se estima que se publicarán las notas del examen final a partir del 26 de febrero, siendo la revisión al menos 2 días después. Las fechas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. Sea el siguiente fragmento de un programa correcto:
… Procedure otro
Var x Procedure uno (Ref p) // parámetro por referencia Var h Procedure otro Begin otro
p:= h + 3 Call uno (p + 1)
End otro Begin uno
If x > 5 Then Return h:= x + p If p > 4 Then p:= p – 1 Call uno (p) Else Call otro
End uno Begin otro
x:= 5 Call uno (x)
End otro …
Se pide, teniendo en cuenta que las variables y las direcciones ocupan 2 bytes: a. Diseñar el Registro de Activación general para este lenguaje. b. Realizar una traza de ejecución del programa representando el contenido completo de
la pila. c. Escribir cuál sería el código intermedio y el código final (detallando todos los accesos
a memoria) que se obtendría para la sentencia h:= x + p que se encuentra en el procedimiento uno.
(4,5 puntos)
2. De una gramática se han entresacado las siguientes reglas:
S Repeat S while E | Add E to id | Move E to id E E ≅ E | id | real
Teniendo en cuenta que las variables pueden ser lógicas o reales, que no existe conversión automática de tipos, que hay que representar los valores lógicos por control de flujo, que la operación Add se realiza sólo entre reales y que el operador ≅ se aplica sobre reales evaluándose como cierto si sus operandos son aproximadamente iguales (se diferencian en menos de 2 décimas), se pide construir una Definición Dirigida por la Sintaxis para realizar el Análisis Semántico y la Generación de Código Intermedio (explicando brevemente los atributos y funciones utilizadas).
(5,5 puntos)
CCOOMMPPIILLAADDOORREESS Segundo parcial, 30 de junio de 2008
1. Fecha estimadas: publicación de las calificaciones: 11 de julio; revisión: 15 de julio. En http://www-lt.ls.fi.upm.es/compiladores se avisarán las fechas exactas.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S → id := E E → id | E ⇐ E | E & E
Téngase en cuenta que: • El lenguaje intermedio a utilizar (código de 3 direcciones) no dispone de operadores lógicos. • El lenguaje tiene tipos entero y lógico y no realiza conversiones de tipos. • Deben explicarse brevemente los atributos y funciones utilizadas. • La tabla de verdad de los operadores lógicos del código fuente es la siguiente:
V V F F V F V F ⇐ V V F V & V F F F
a. Diseñar un Esquema de Traducción para el Analizador Semántico y el Generador de Código Intermedio representando los valores lógicos por control de flujo.
b. Diseñar una Definición Dirigida por la Sintaxis para el Generador de Código Intermedio representando los valores lógicos numéricamente.
(5,5 puntos)
2. Sea el siguiente fragmento de un programa escrito en un determinado lenguaje: Global a: Entero Proc Prueba
b: Matriz [1:5] de Entero
Proc P1 (Ref x: Entero; y: Real; Ref z: Matriz [1:5] Entero) Inicio P1 Si x - y < 1 Entonces a:= a + 1 z[x]:= a Fin P1
Proc (Ref x: Entero; y: Matriz [1:5] de Entero) P2 Local i: Entero Proc P3 (z: Entero) Local f: Real Inicio P3 f:= z / 2.0 Llama P1 (z, f, y) Fin P3 Inicio P2 Desde i:= 1 Hasta x Haz Llama P3 (y[i]) a:= y[1] + y[2] + 2
Fin P2 Inicio Prueba a:= 2; b:= [1, 2, 3, 4, 5] Llama P2 (a, b) Fin Prueba
Imprime (a)
Se pide:
a. Diseñar un Registro de Activación general para este lenguaje. b. Realizar la traza de ejecución detallada del fragmento de
programa dado, representando todo el contenido de la memoria e indicando lo que imprime el programa.
c. ¿Qué pasaría si en el cuerpo del programa Prueba se sustituye la llamada a P2 (a, b) por P3 (a, b)?
El compilador y el lenguaje tienen las siguientes características:
• El compilador no realiza ninguna optimización. Todos los temporales se han de almacenar en memoria
• El lenguaje tiene recursividad • El lenguaje tiene estructura de
bloques con reglas de ámbito léxico y anidamiento
• Las direcciones y los enteros ocupan 2 bytes
• Los reales ocupan 4 bytes • Los parámetros se pueden pasar
por referencia (Ref) o por valor (si no se especifica nada)
• Las expresiones lógicas tienen evaluación perezosa (cortocircuito), lo cual implica que los valores lógicos se representan por control de flujo
• El lenguaje solo dispone de procedimientos.
(4,5 puntos)
CCOOMPILLADDOOREES Primer parcial, 30 de junio de 2008
1. Fecha estimadas: publicación de las calificaciones: 11 de julio; revisión: 15 de julio. En http://www-lt.ls.fi.upm.es/compiladores se avisarán las fechas exactas.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. Se tiene un lenguaje con identificadores y números:
• Los números pueden ser enteros o reales, y pueden todos llevar el punto de millar (sólo en la parte entera y correctamente colocado). Por ejemplo, son correctos: “1234567”, “1.234.567”; son incorrectos: “1234.567”, “123.456.7”.
• Los reales llevan coma decimal y pueden no tener parte entera o parte fraccionaria (pero han de llevar al menos una de las dos). Por ejemplo, son correctos: “1,2”, “1,”, “,1”, “12.345,67”; son incorrectos: “,”, “12,345.67”.
• Los identificadores pueden estar formados por letras, dígitos y guiones bajos, pero no pueden empezar ni terminar por guión bajo, ni llevar dos guiones seguidos, y, obligatoriamente han de contener alguna letra. Por ejemplo, son correctos: “abc”, “123a”, “a_b”; son incorrectos: “_a”, “a_”, “a___b”, “1_2”, “369”.
Se pide diseñar un Analizador Léxico para este lenguaje (gramática, tokens, autómata determinista, acciones semánticas y algunos mensajes de error).
(4,5 puntos)
2. Se tiene la siguiente gramática:
S if E then S | R = E E E + T | T T id R id
Se pide: a. Demostrar si es válida (construyendo la tabla) para un SLR(1). Si no lo fuera, modificar
la gramática para que lo sea. b. Demostrar si es válida para construir un Analizador Sintáctico Descendente Predictivo. Si no lo fuera, modificar la gramática para que lo sea y demostrarlo.
(5,5 puntos)
CCOOMMPPIILLAADDOORREESS Examen final, 4 de septiembre de 2008
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 16 de septiembre. 2. Fecha estimada de la revisión: 18 de septiembre. 3. En http://www‐lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de publicación de
las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 2 ¾ horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. Dada la siguiente gramática:
S A B A B C | k C B C D | λ D k B C + A
Se pide: a. Realizar el Autómata Reconocedor de Prefijos Viables (correspondiente al análisis LR) en la
plantilla adjunta (ésta contiene un número reducido de errores: pueden faltar o sobrar elementos).
b. Comprobar sobre el autómata si existen conflictos. c. Comprobar si la gramática cumple las condiciones LL(1). d. Independientemente de las respuestas a las dos cuestiones anteriores, ¿presenta la gramática
algún problema adicional para la construcción de un Analizador Sintáctico? (3.75 puntos)
2. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S → while E do id := E E → id | not E | E ⇔ E | E ? E : E
Se pide diseñar un Esquema de Traducción para el Analizador Semántico y el Generador de Código Intermedio representando los valores lógicos numéricamente. Téngase en cuenta que: • El lenguaje dispone de tipos enteros, reales y lógicos, y no admite conversión entre tipos. • El operador lógico ⇔ devuelve cierto sólo si sus operandos son iguales. • La operación E1 ? E2 : E3 tiene el siguiente significado: si E1 es cierta, la operación devuelve
E2; si es falsa, devuelve E3 (estas dos últimas expresiones pueden ser de cualquiera de los tres tipos).
• El código de 3 direcciones no dispone de operadores lógicos. • Deben explicarse brevemente los atributos y funciones utilizadas.
(3.75 puntos)
3. Programar (en pseudocódigo) el fragmento del Generador de Código Objeto que se encarga de la traducción de las sentencias call del lenguaje intermedio (tres direcciones) a código objeto (ensamblador). Téngase en cuenta que se trata de un compilador para un lenguaje que admite recursividad, anidamiento de procedimientos, dispone sólo del tipo entero y tiene paso de parámetros por valor. Los Registros de Activación se almacenarán en pila. Un entero ocupa 4 bytes y una dirección 2 bytes.
Dibujar un esquema del diseño general del Registro de Activación utilizado (especificando el contenido y la posición del puntero de pila).
(2.5 puntos)
S →
A ●
B
B
+
C
I 3
I 0I 2
I 4
k
I 6
I 7 I 5
I 8 I 9
I 11
I 12
I 13
Co
mp
ilad
ore
sC
om
pil
ad
ore
s4
-sep
tiem
bre
-20
08
, Eje
rcic
io 1
.aH
oja
de
Res
pues
ta
Ape
llidos
: ....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
...
Nom
bre:
.....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
....
I 15
CCOOMPPILLAADOOREES Examen del primer parcial. 6 de febrero de 2009
Observaciones: 1. Las calificaciones del primer parcial se publicarán en la primera quincena de marzo, siendo la revisión al menos 2 días después. Las fechas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. Un lenguaje tiene los siguientes elementos:
• Operadores aritméticos: +, -, *, /, ** • Operadores lógicos: .AND., .OR., .NOT. • Identificadores que comienzan por una letra y van seguidos de un máximo de 7 letras o
dígitos • Palabras reservadas en mayúsculas, como IF, THEN, FOR, WHILE, INTEGER… • Números reales según la expresión regular: d*.d+
Teniendo en cuenta que el lenguaje distingue mayúsculas de minúsculas, se pide construir un Analizador Léxico para este lenguaje (tokens, gramática, autómata finito determinista y acciones semánticas).
(4 puntos)
2. Sea la siguiente gramática:
E T R R + T R | - T R | λ T id
Se pide: a. Construir las tablas de un analizador sintáctico SLR, dando también el autómata en la
plantilla adjunta (plantilla que contiene errores y está incompleta). b. Construir la tabla de un analizador sintáctico LL(1). c. Contestar brevemente a las siguientes preguntas tanto para el SLR como para el LL
según las respuestas de los apartados a y b. Si alguna de ellas no tiene sentido para alguno de los analizadores, explicar la razón: 1. ¿En qué casos podría haber conflictos? Estudiar cada uno de esos casos y decir si
hay o no conflicto. 2. ¿Es válida la gramática para ese tipo de analizadores o aparece algún problema? 3. ¿Cómo se sabe en el estado I2 cuál de las reglas de R hay que aplicar? 4. ¿Cómo se sabe si la regla R + T R se aplica en el estado I2, en el I7 ó en el I8? 5. ¿Hay problema con la recursividad de R + T R y R - T R? En caso afirmativo,
decir cuál y si se puede resolver de alguna manera. 6. ¿En algún caso se puede aplicar la regla R λ? En caso afirmativo, decir cuándo;
en caso negativo, explicar cuál es el problema. 7. ¿Cómo sabe el analizador en un momento dado si tiene que aplicar la regla
R + T R o la regla R - T R? 8. ¿Qué hace el analizador cuando R está en la cima de la pila e id en la entrada?
(6 puntos)
CCOOMPPILLAADOOREES Examen final. Segundo parcial. 6 de febrero de 2009
Observaciones: 1. Se estima que se publicarán las notas del examen final a partir del 20 de febrero, siendo la revisión al menos 2 días después. Las fechas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2 horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. De una gramática se han entresacado las siguientes reglas:
S id := E E id ( L ) | id | E * E L E | λ
Las variables son enteras y reales, no hay conversión automática de tipos e id (L) puede representar una llamada a una función (con uno o ningún parámetro) o un acceso a un elemento de un vector (siendo necesario indicar el índice). Se pide construir una Definición Dirigida por la Sintaxis para realizar el Análisis Semántico y la Generación de Código Intermedio (explicando brevemente los atributos y funciones utilizadas).
(6 puntos)
2. Sea el siguiente programa:
Program Cálculo-día Type fecha: Record= día: integer, mes: integer, año: integer; Global t, a: integer hoy: fecha Procedure P-año (Ref z: fecha) /* parámetro por referencia Begin P-año z.año:= z.año + 1 End P-año Procedure P-mes (Ref b: integer; Ref x: fecha) /* parámetros por referencia Procedure P-día () Begin P-día While ((a / t) > 8) Do a:= a - t Call P-año (x) End While x.día:= x.día + 1; End P-día Begin P-mes If ((a / t) < x.mes) Then x.mes:= a / t Else Call P-día () End P-mes Begin Cálculo-día a:= 300 t:= 30 hoy.día:= 6 hoy.mes:= 2 hoy.año:= 2009 Call P-mes (a, hoy) Imprime (hoy.día, hoy.mes, hoy.año) End Cálculo-día
Teniendo en cuenta que los enteros y las direcciones ocupan 2 bytes, se pide: a. Diseñar el Registro de Activación general para este lenguaje. b. Realizar una traza de ejecución del programa representando el contenido completo de
la pila e indicando el resultado de la sentencia “Imprime”. (4 puntos)
TR
+
λT
I 0
I 2
I 7
I 8
Co
mp
ilad
ore
sC
om
pil
ad
ore
s 6
-feb
rero
-20
09
, Eje
rcic
io 2
.a
Hoja
de
Res
pues
ta
Ape
llidos
: ....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
.
Nom
bre:
.....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
..
id
+
+-
CCOOMMPPIILLAADDOORREESS Segundo parcial, 22 de junio de 2009
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 9 de julio. 2. Fecha estimada de la revisión: 13 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 2 horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. De un lenguaje se ha extraído el siguiente fragmento de gramática:
S → id := E | if ( E ) then S | switch ( E ) { L } | S ; S L → case C : S ; L | λ E → C | id | E oprel E | E + E C → cte | cte : cte : cte
Se pide diseñar el Analizador Semántico construyendo una Definición Dirigida por la Sintaxis. Téngase en cuenta que: • El lenguaje define las constantes enteras y el tipo entero con 2 bytes • La expresión de la sentencia if ha de ser lógica • La máquina objeto dispone de enteros de 2 y 4 bytes • La sentencia switch admite como expresión un entero o una hora • Las constantes de tipo hora (cte : cte : cte) deben ser correctas • Las horas se tienen que almacenar internamente como el número de segundos transcurridos desde la media noche
• No hay conversiones automáticas de tipos • Se admiten operaciones de comparación y de suma entre enteros y horas.
(6 puntos)
2. Sea el siguiente fragmento de un programa:
Program Main Var i: Integer Function A (Ref x: Integer) Procedure B (Ref y: Integer) Var j: integer Begin B If Then Return (y <= 0) Else Begin y:=y-2 :=y-1 i End j:=A (i) End B Begin A x:=x-1 B (x) Return 2*x End A Begin Main i:= 2 i:= A (A (i)) IEnd Main
mprime (i)
El compilador y el lenguaje tienen las siguientes características:
• El compilador no realiza ningún tipo de optimización
• El lenguaje tiene estructura de bloques • El modo de paso de los parámetros es por
referencia • Las enteros y las direcciones ocupan 2 bytes
Se pide: a. Diseñar el Registro de Activación general
para este lenguaje. b. Realizar una traza de ejecución del
programa representando el contenido completo de la pila, e indicando el resultado de la sentencia “Imprime”.
(4 puntos)
CCOOMMPPIILLAADDOORREESS Primer parcial, 22 de junio de 2009
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 9 de julio. 2. Fecha estimada de la revisión: 13 de julio. 3. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de
publicación de las calificaciones y la fecha y hora definitiva de la revisión. 4. La duración de este examen será de 1½ horas. 5. Cada ejercicio deberá entregarse en hojas separadas. 6. Los dos ejercicios tienen la misma puntuación.
1. Se tiene un lenguaje en el que hay identificadores, palabras reservadas, números enteros, operadores aritméticos de suma y resta y lo que se explica a continuación:
• Los identificadores están formados por letras y tienen una longitud máxima de 6 caracteres. Si empiezan por alguna de las letras I, J, K, L, M, N son enteros salvo que se declaren explícitamente de otro tipo.
• La declaración explícita de un identificador se construye con la palabra reservada que indica el tipo (REAL, INTEGER o CHARACTER *long), seguida de la lista de identificadores separados por comas. En la declaración de una variable de tipo carácter, se indica la longitud de la variable con un asterisco y un número entero de no más de 3 dígitos (debe ser una comprobación léxica).
• Las palabras reservadas están formadas por letras. • Los números pueden ser positivos y negativos.
Se pide:
a. Construir el Analizador Léxico para este lenguaje (Gramática Regular, tokens, AFD, Acciones Semánticas e indicar 5 posibles casos de error), teniendo en cuenta que se debe introducir en la Tabla de Símbolos toda la información posible.
b. Si el lenguaje tuviera también la operación de producto, ¿qué cambios habría que realizar en el diseño de este Analizador Léxico?
2. Sea la siguiente gramática:
S → while COND do CUERPO end | goto id | λ COND → id CUERPO → begin REST end REST → S REST | λ
Se pide: a. Completar en la plantilla adjunta el Autómata Reconocedor de Prefijos Viables
(método SLR). La plantilla puede contener errores y/o omisiones. b. Analizar la posible existencia de conflictos en el autómata anterior. Si hay algún
conflicto, plantear una sentencia donde, caso de usarse dicho autómata, se llegaría a una situación de conflicto y explicar por qué se produce.
Co
mp
ilad
ore
sC
om
pil
ad
ore
s2
2-j
un
io-2
00
9,
Eje
rcic
io 2
.aH
oja
de
Res
pues
ta
Ape
llidos
: ....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
...
Nom
bre:
.....
......
......
......
......
......
......
......
......
......
......
......
......
......
......
......
....
I 0
I 1
I 2
I 4 I 7
I 5
I 11
I 12
I 13
I 15
I 9
I 2I 3
I 14
I 8 I 10
CCOOMMPPIILLAADDOORREESS Examen final, 1 de septiembre de 2009
Observaciones: 1. Fecha estimada de publicación de las calificaciones: 15 de septiembre. Fecha estimada de la revisión: 17 de septiembre. En http://www-lt.ls.fi.upm.es/compiladores se avisará la fecha exacta de publicación de las calificaciones y la fecha y hora definitiva de la revisión.
4. La duración de este examen será de 2¼ horas. 5. Cada ejercicio deberá entregarse en hojas separadas.
1. La descripción de un fragmento de un lenguaje de programación viene dada por: (3 puntos) S id = E | if ( E ) then S | switch ( E ) { L } | S ; S E C | id | E oprel E | E + E C cte | cte:cte:cte cte dígito dígitos dígito 0 | 1 | … | 9 digitos dígito dígitos | λ id letra letras letra a | b | c | … | z | A | B | C | … | Z letras letra letras | λ L case C = S ; L | λ oprel <> | =
Se pide diseñar un Analizador Léxico (gramática regular, tokens, autómata finito determinista, acciones semánticas) correspondiente a dicho lenguaje. El lenguaje presenta las siguientes características: • El lenguaje define las constantes enteras y el tipo entero con 2 bytes • La expresión de la sentencia if ha de ser lógica • La máquina objeto dispone de enteros de 2 y 4 bytes • La sentencia switch admite como expresión un entero o una hora • Las constantes de tipo hora (cte:cte:cte) deben representar horas correctas (dando un error léxico en caso
contrario), y cada parte de la hora debe ir escrita con dos dígitos • Las horas tienen que almacenarse internamente como el número de segundos transcurridos desde la media noche • Las palabras clave del lenguaje son reservadas • Los elementos pueden ir separados por delimitadores • No hay conversión automática de tipos • Se admiten operaciones de comparación y de suma entre enteros y horas
2. Sea la siguiente gramática: (3 puntos) S begin DEF end DEF Deffuente DEF | Defvector DEF | Defestilo DEF | λ Deffuente fuente id Defvector vector integer : integer Defestilo estilo integer
a. Demostrar que se trata de una gramática LL, válida para construir un Analizador Descendente LL(1). b. Construir la tabla del Analizador Sintáctico Descendente LL. c. Definir una gramática equivalente a la anterior, pero que no sea LL, presentando al menos recursividad por la izquierda y no estando factorizada. d. Construir la tabla de Precedencia de Operador y razonar si la siguiente gramática es válida o no para construir un Analizador Sintáctico con este método. Para construir la tabla de precedencia, deben colocarse primero los operadores y a continuación las letras, según su orden de aparición en la gramática:
S A * B + B | B + A * A A a + a B b * b
3. Dado el siguiente fragmento de gramática de un lenguaje: (4 puntos) S id := E E id (L) | id L E, L | E
donde id(L) puede ser una llamada a función o el acceso a un elemento de un vector unidimensional de índices enteros. Teniendo en cuenta que no hay conversiones automáticas de tipos y que todo identificador tiene que estar declarado previamente, se pide diseñar una Definición Dirigida por la Sintaxis con el Comprobador de Tipos y el Generador de Código Intermedio (código de 3 direcciones).
CCOOMMPPIILLAADDOORREESS Examen del primer parcial. 11 de febrero de 2010
Observaciones: 1. Las calificaciones del primer parcial se publicarán aproximadamente a mediados de marzo. Se avisará en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 1¾ horas. 3. Cada ejercicio deberá entregarse en hojas separadas. 4. Los dos ejercicios tienen la misma puntuación.
1. Se tiene un lenguaje con números, constantes de tipo cadena, variables y una serie de operadores y que no cuenta con conversión automática de tipos. Todos los elementos del lenguaje tienen que ir separados obligatoriamente por al menos un delimitador.
Los números pueden ser tanto enteros como reales. Los números enteros están formados por una secuencia de dígitos. Los números reales han de llevar un punto (“.”) y pueden no tener parte entera, pero han de tener obligatoriamente parte real (son correctos, por ejemplo, “.67” y “128.6”, pero no “14.”).
Las constantes de tipo cadena van encerradas entre comillas dobles ("). Dentro de la cadena puede haber cualquier carácter excepto las propias comillas.
Las variables pueden ser de tipo cadena, vector, entero o real. El lexema de la variable estará formado por una combinación de letras y dígitos de cualquier longitud, pero siempre tendrá al menos una letra.
Los operadores del lenguaje son los siguientes: • el operador de asignación (“=”), válido sólo entre expresiones del mismo tipo. • el operador de concatenación de cadenas (“.”), válido sólo para cadenas. • el operador de comparación entre números (“=”), válido sólo para números. • el operador de comparación entre cadenas (“==”), válido sólo para cadenas.
Se pide construir un Analizador Léxico para este lenguaje (tokens, gramática, autómata finito determinista y acciones semánticas).
2. Sea la siguiente gramática en EBNF inspirada en la sintaxis del lenguaje COBOL:
S procedure division . [ DECLARACIONES ] { CUERPO }1 DECLARACIONES declaratives . { STRUCT use PÁRRAFO }1 end declaratives CUERPO id section . { PÁRRAFO }1 STRUCT id section number | λ PÁRRAFO number . SENTENCE SENTENCE goto id | evaluate id
Se pide: a. Realizar el diagrama de transición para las reglas de S, DECLARACIONES y SENTENCE. b. Definir el programa del Analizador Sintáctico Descendente Predictivo Recursivo para esta
gramática, que es LL(1). Se deberá usar el siguiente procedimiento auxiliar: ComprobarToken (t: token) Begin If (t = SiguienteToken)
Then Leer (SiguienteToken) Else Error (t)
End
Nota 1: En el programa se puede abreviar el nombre de la función ComprobarToken por CT y el nombre de la variable SiguienteToken por ST.
Nota 2: En la notación EBNF, el significado de los meta‐símbolos es el siguiente: • [ ]: Opcional • { }1: Repetitiva de 1 a n veces
CCOOMMPPIILLAADDOORREESS Examen final. Segundo parcial. 11 de febrero de 2010
Observaciones: 1. Se estima que se publicarán las notas del examen final el 22 de febrero, siendo la revisión el 2 de marzo. Las fechas exactas se avisarán en http://www-lt.ls.fi.upm.es/compiladores.
2. La duración de este examen será de 2¼ horas. 3. Cada ejercicio deberá entregarse en hojas separadas.
1. De una gramática de un lenguaje se han entresacado las siguientes reglas: P D ; S D T : V | D ; D T integer | logical | time V id , V | id S id := E E C | id | E O E | E + E C cte | cte : cte : cte O < | > | = | <>
Se pide construir una Definición Dirigida por la Sintaxis para realizar el Análisis Semántico y la Generación de Código Intermedio (explicando brevemente los atributos y funciones utilizadas), teniendo en cuenta que: • El lenguaje dispone de constantes enteras (cte) y constante de tipo hora (cte:cte:cte) • El lenguaje tiene conversiones de tipo automáticas entre enteros, lógicos y horas • Si los sumandos son de distinto tipo, el resultado de la suma es entero; si los sumandos son del
mismo tipo, el resultado conserva el tipo de los sumandos • Las constantes de tipo hora deben ser correctas y se almacenan internamente como un valor
entero que representa el número de segundos transcurridos desde la media noche • Los enteros se representan con 4 bytes y los lógicos con 1 byte • En las expresiones lógicas, el valor 0 se considera como falso y cualquier otro valor como
verdadero. (6 puntos)
2. Sea el siguiente programa correcto:
Program QR Procedure Main Var a:= 3, b:= 5: integer; Procedure Q; Var b: integer; BEGIN Q a:= a - 1; b:= a; IF b > 0 THEN R (a); END Q; Procedure R (b: integer); BEGIN R b:= b - a; Q; END R; BEGIN Main Q; PRINT (a); PRINT (b); END Main; BEGIN QR Main; END QR.
Teniendo en cuenta que se trata de un compilador de dos pasadas, que los enteros y las direcciones ocupan 2 bytes, que las expresiones lógicas se representan mediante la técnica de flujo de control, que se utiliza una estrategia de asignación de memoria mediante pila y que el lenguaje sigue las reglas de ámbito léxico, se pide: a. Diseñar el Registro de Activación general
para este lenguaje. b. Realizar la traza de ejecución del programa
representando el contenido completo de la memoria, indicando el resultado de las sentencias “PRINT”. Se realizará la traza dos veces, considerando, primero, el paso de parámetros por referencia y, después, el paso de parámetros por valor.
(4 puntos)