Professional Documents
Culture Documents
Se desea implementar una calculadora con sintaxis Lisp. El programa debe procesar
una secuencia de listas Lisp tomadas de stdin. Cada lista contiene una expresin
aritmtica (en notacin prefija), y para cada una de ellas se debe escribir el resultado
de su expresin correspondiente. Para simplificar, asumiremos '+' y '*' como nicos
operadores.
Ejemplo: Para un fichero de entrada como el siguiente
(+ 2 4 6 8 10);
(* (+ 1 2 3) (+ 9 7 1))
(+
(* 10 2 3)
25
(* 8 9 (+ 1 1) )
);
(+ 20 -20);
(+ 20);
(* 30);
30
102
229
0
20
30
-1-
Compiladores I
1 Convocatoria 95/96 (27-I-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
==ALS AL
==
==AL
==NUM NS
==NS N
==N
',' NS
'\n'
Se desea saber si se trata de una gramtica SLR o no. Para ello, responder a las
siguientes preguntas.
Ejercicio 4 (2 ptos.): Construir la familia cannica de conjuntos LR(0)
Ejercicio 5 (1.5 ptos.): Construir el autmata a partir de dichos conjuntos
Ejercicio 6 (1.5 ptos.): Se trata de una gramtica SLR o no?
3 horas
-2-
Compiladores I
2 Convocatoria 95/96 (22-VI-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
listaID ID
ID
b) listaID:
|
ID listaID
ID
-1-
Compiladores I
2 Convocatoria 95/96 (22-VI-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
v 2,3
[
h 1,1
[
---+
++++
]
h 2,1,2
[
++++
---v 1,1
[
+++-+-+
]
]
]
Compiladores I
2 Convocatoria 95/96 (22-VI-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
30
102
229
0
20
30
-3-
Compiladores I
2 Convocatoria 95/96 (22-VI-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
2 horas 30 min.
-4-
Compiladores I
3 Convocatoria 95/96 (3-IX-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
1.2)
[a-zA-Z]
[0-9]
"_"
-1-
Compiladores I
3 Convocatoria 95/96 (3-IX-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Escribir una gramtica lo ms clara y compacta posible para dicho lenguaje. Utilizar
letras minsculas para los no terminales de la gramtica, as como los siguientes
terminales:
terminal
T
E
P
I
B
lo que denota
un ttulo
un entero
un prrafo
una ilustracin
una pg. en blanco
Razonar sobre si es una gramtica LL(1) o no. En caso de no serlo, dar una gramtica
equivalente que sea LL(1)
Ejercicio 4 (3 ptos.): Considrese la siguiente gramtica que se usa para el
tratamiento de determinado tipo de expresiones:
exp= ter '=' ter
exp= ter
ter= ter '+' fact
ter= ter AND fact
ter= fact
fact= ENTERO
fact= BOOLEANO
fact= '(' exp ')'
Las reglas de tipo para las expresiones de la gramtica son las siguientes:
1)
2)
3)
Compiladores I
3 Convocatoria 95/96 (3-IX-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
4)
%}
%union{
atrib atributos;
}
%token ENTERO BOOLEANO AND
%type <atributos> exp ter fact
%%
exp : ter '=' ter
{/*-UNO-*/}
| ter
{/*-DOS-*/}
;
ter : ter '+' fact
| ter AND fact
| fact
;
{/*-TRES-*/}
{/*-CUATRO-*/}
{/*-CINCO-*/}
fact : ENTERO
| BOOLEANO
| '(' exp ')'
;
{/*-SEIS-*/}
{/*-SIETE-*/}
{/*-OCHO-*/}
%%
main()
-3-
Compiladores I
3 Convocatoria 95/96 (3-IX-96)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
{
yyparse();
}
4.1)
4.2)
3 horas
-4-
Compiladores I
1 Convocatoria 96/97 (1-II-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
{/*6*/}
{/*7*/}
opRel:
'='
| '<'
| '>'
| tMEI
| tMAI
| tNI
;
{/*corresponde a "<="*/
{/*corresponde a ">="*/
{/*corresponde a "<>"*/
{/*8*/}
{/*9*/}
{/*10*/}
/*11*/}
/*12*/}
/*13*/}
{/*corresponde a "OR"*/
{/*14*/}
{/*15*/}
/*16*/}
opSum:
'+'
| '-'
| tOR
;
opMul:
'*'
| tDIV
| tMOD
| tAND
;
{/*17*/}
{/*corresponde a "DIV"*/ /*18*/}
{/*corresponde a "MOD"*/ /*19*/}
{/*corresponde a "AND"*/ /*20*/}
-1-
Compiladores I
1 Convocatoria 96/97 (1-II-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
term:
factor
| '+' term
| '-' term
| term opMul factor
;
%prec MASMAS
%prec MENOSMENOS
{/*21*/}
{/*22*/}
{/*23*/}
{/*24*/}
factor:
tCONSTENTERA
| tCONSTCHAR
| tFALSE
| tTRUE
| tIDENTIFICADOR
| tIDENTIFICADOR selCompVect
| tIDENTIFICADOR paramActuales
| '(' expr ')'
| tNOT factor
%prec NEG
;
{/*25*/}
{/*26*/}
{/*27*/}
{/*28*/}
{/*29*/}
{/*30*/}
{/*31*/}
{/*32*/}
{/*33*/}
paramActuales:
'(' listaExpr ')'
;
{/*34*/}
listaExpr:
listaExpr
','
expr
| expr
;
{/*35*/}
{/*36*/}
{/*37*/}
{/*38*/}
selCompVect:
'[' expr ']'
;
{/*39*/}
.......
-2-
Compiladores I
1 Convocatoria 96/97 (1-II-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Notas:
1) Para evitar confusiones, escribir en las hojas que entregueis el nmero
correspondiente a la parte del cdigo y, a continuacin, el cdigo
correspondiente. Por ejemplo:
4)
{$$=$1;}
2)
2.1
2.2
-3-
Compiladores I
1 Convocatoria 96/97 (1-II-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
2.3
3.2
3.3
3 horas
-4-
Compiladores I
2 Convocatoria 96/97 (4-VII-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
ID ':'
asignacion:
ID OPAS VAL ';'
;
%%
-1-
Compiladores I
2 Convocatoria 96/97 (4-VII-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
) 7
66) 55 (44
8)
33
(22 11)))
-2-
Compiladores I
2 Convocatoria 96/97 (4-VII-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Ejercicio 3 (0.75 ptos.): El libro "Pascal: User Manual and Report" de K. Jensen y
N. Wirth, que establece la especificacin ISO Pascal Standard, define un comentario
del lenguaje como (slo vamos a considerar comentarios vlidos aqullos que
empiezan por "(*" y terminan por "*)"):
"(*" seguido de cualquier secuencia de 0 ms caracteres que
no contenga "*)", y terminado por "*)"
Escribir una expresin regular con sintaxis LEX para los comentarios Pascal as
definidos.
2:45 horas
-3-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Ejercicio 1 (2.5 ptos.): La invocacin a Yacc con una gramtica dada ha generado el
fichero 'y.output' que se muestra en el Anexo 1. Se pide lo siguiente:
1.1) (1.0 Ptos.) Deducir a partir de dicho fichero cul es la gramtica que lo
genera
1.2) (0.5 Ptos.) Razonar por qu no es una gramtica LL(1)
1.3) (1.0 Ptos.) Transformar la gramtica a una equivalente que s lo sea, y
obtener para esta transformada la tabla del anlisis LL(1)
b)
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
c)
d)
3 horas
-2-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Anexo 1
state 0
$accept
$end
a
+
.
shift 4
shift 3
error
S
A
goto 1
goto 2
_S
goto 5
goto 6
B
D
state 6
B : D_C
state 14
A :
+
(2)
.
(1)
A_
reduce 2
a
+
.
shift 4
shift 3
error
S
A
goto 13
goto 2
a
+
.
shift 4
shift 3
error
goto 14
c
*
.
shift 12
shift 11
error
goto 18
state 16
D : b_
.
.
(4)
reduce 4
state 11
C : *_D C
b
(
.
shift 16
shift 8
error
goto 15
state 12
C : c_
.
reduce 7
-3-
(7)
(9)
reduce 9
state 17
D :
(
(8)
)_
C_
reduce 8
state 18
C :
*
(6)
.
(3)
shift 17
error
state 15
C : * D_C
reduce 3
reduce 1
reduce 9
reduce 9
reduce 5
state 10
B : D C_
goto 9
goto 6
state 5
S : A B_
(5)
(9)
state 9
A : + B_A
shift 7
shift 8
error
state 4
A : a_
)
.
state 8
D : (_S )
state 3
A : +_B A
b
(
.
goto 10
state 13
D : ( S_)
state 2
S : A_B
B
D
c
*
.
$end accept
. error
shift 7
shift 8
error
shift 12
shift 11
error
state 7
B : b_
D : b_
state 1
$accept
S_$end
b
(
.
c
*
.
reduce 6
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Anexo 2
/*======================================================================
Prog.:
tabla.h
Tema:
funciones para manipular una tabla de simbolos para un
lenguaje de bloques
Fecha:
Noviembre-96
Fuente:
J. Neira
Com.:
MODIFICADA PARA EXAMEN SEPTIEMBRE 97 DE COMPI
=======================================================================*/
/*========================================================*/
/*
D E F I N I C I O N E S
*/
/*========================================================*/
#define MAXLONGID
#define TAMANO_TABLA
#define CIERTO
#define FALSO
100
7
1
0
/*========================================================*/
/*
T I P O S
*/
/*========================================================*/
typedef enum {
PROGRAMA,
VARIABLE,
PROCEDIMIENTO,
FUNCION,
PARAMETRO,
RESULTADO
} TIPO_SIMBOLO;
/*categor`ias de s`imbolos*/
typedef enum {
ENTERO,
BOOLEANO,
CHAR,
STRING
} TIPO_VARIABLE;
/*tipos de datos*/
typedef enum {
IN,
OUT,
INOUT
} CLASE_SIMBOLO;
/*clases de par'ametros*/
struct UN_SIMBOLO {
TIPO_SIMBOLO tipo;
char identificador[MAXLONGID];
TIPO_VARIABLE variable;
int es_vector;
int minimo;
int maximo;
/* Si vector, indices */
CLASE_SIMBOLO clase;
int nivel;
-4-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
int dir;
int visible;
lista parametros;
/* Si proc/func, lista de
puntero a los simbolos de los
parametros */
/* Si es resultado de func.,
puntero al simbolo de
la funcion */
char valor[300];
};
typedef struct UN_SIMBOLO SIMBOLO;
typedef lista TABSIM[TAMANO_TABLA];
/*========================================================*/
/*
M A C R O S
*/
/*========================================================*/
#define
#define
#define
#define
#define
#define
#define
#define
/*========================================================*/
/*
F U N C I O N E S
*/
/*========================================================*/
/*========================================================*/
void inicializar_tabla (TABSIM tabla);
/*========================================================
Crea una tabla de simbolos vacia.
IMPORTANTE: Este procedimiento debe invocarse antes de hacer
ninguna operacion con la tabla de simbolos.
========================================================*/
/*========================================================*/
SIMBOLO *buscar_simbolo (TABSIM tabla,
char *identificador);
/*========================================================
Busca en la tabla el simbolo de mayor nivel cuyo
identificador coincida con el del parametro (se distinguen
minusculas y mayusculas). Si existe, devuelve como
resultado un puntero al s`imbolo, de lo contrario devuelve
NULL.
========================================================*/
/*========================================================*/
-5-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
SIMBOLO *introducir_programa (TABSIM tabla,
char *identificador,
int dir);
/*========================================================
Introduce en la tabla un simbolo de tipo PROGRAMA, con el
identificador del parametro, de nivel 0, con la direccion
del parametro. Dado que debe ser el primer simbolo a
introducir, NO SE VERIFICA QUE EL SIMBOLO YA EXISTA.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_variable (TABSIM tabla,
char *identificador,
TIPO_VARIABLE variable,
int nivel,
int dir,
char *val);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo VARIABLE (simple) con los datos
de los argumentos.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_vector (TABSIM tabla,
char *identificador,
int minimo,
int maximo,
TIPO_VARIABLE variable,
int nivel,
int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo VARIABLE (vector) con los datos
de los argumentos.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_procedimiento (TABSIM tabla,
char *identificador, int nivel, int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo PROCEDIMIENTO con los datos de
los argumentos.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_funcion (TABSIM tabla,
char *identificador,
int nivel,
int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo FUNCION con los datos de los
argumentos.
IMPORTANTE: El resultado de la funcion debera ser
introducido como un simbolo diferente, de tipo RESULTADO y
de nivel + 1.
========================================================*/
-6-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
/*========================================================*/
SIMBOLO *intenta_introducir_resultado (TABSIM tabla,
char *identificador,
TIPO_VARIABLE variable,
SIMBOLO *funcion,
int nivel,
int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo RESULTADO con los datos de los
argumentos.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_parametro_simple (TABSIM tabla,
char *identificador,
TIPO_VARIABLE variable,
int clase,
int nivel,
int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo PARAMETRO (simple) con los
datos de los argumentos.
IMPORTANTE: Los parametros NO quedan ligados al
procedimiento o funcion donde estan declarados. Se debe
hacer una lista con los punteros que esta funcion devuelva,
y asociarla con el proc/func correspondiente utilizando el
procedimiento colgar_parametros.
========================================================*/
/*========================================================*/
SIMBOLO *intenta_introducir_parametro_vector (TABSIM tabla,
char *identificador,
int minimo,
int maximo,
TIPO_VARIABLE variable,
int clase,
int nivel,
int dir);
/*========================================================
Si existe un simbolo en la tabla del mismo nivel y con el
mismo identificador, devuelve NULL. De lo contrario,
introduce un simbolo de tipo PARAMETRO (vector) con los
datos de los argumentos.
IMPORTANTE: Los parametros NO quedan ligados al
procedimiento o funcion donde estan declarados. Se debe
hacer una lista con los punteros que esta funcion devuelva,
y asociarla con el proc/func correspondiente utilizando el
procedimiento colgar_parametros.
========================================================*/
/*========================================================*/
void colgar_parametros (TABSIM tabla,
SIMBOLO *procfunc,
lista lista);
/*========================================================
Asocia la lista (que debe ser una lista de SIMBOLOS
previamente introducidos, correspondientes a parametros)
-7-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
con el simbolo correspondiente a un procedimiento o
funcion.
========================================================*/
/*========================================================*/
void ocultar_parametros (TABSIM tabla,
int nivel);
/*========================================================
Marca todos los parametros de un nivel como ocultos para que
no puedan ser encontrados por la funcion buscar_simbolo. Se
mantiene la definicion completa del procedimiento/funcion
donde estan declarados para verificacion de invocaciones al
procedimiento/funcion.
========================================================*/
/*========================================================*/
void eliminar_programa (TABSIM tabla);
/*========================================================
Elimina de la tabla todos los simbolos (deberia haber uno
solo) de tipo programa y nivel 0.
========================================================*/
/*========================================================*/
void eliminar_variables (TABSIM tabla,
int nivel);
/*========================================================
Elimina de la tabla todas las variables (simples y vectores)
que sean del nivel del argumento.
IMPORTANTE: No elimina parametros ni valores resultado de
funciones.
========================================================*/
/*========================================================*/
void eliminar_parametros_ocultos (TABSIM tabla,
int nivel);
/*========================================================
Elimina de la tabla todas los parametros que hayan sido
ocultados previamente.
IMPORTANTE: Los procedimientos y funciones donde los
parametros ocultos estaban declarados, deben ser eliminados
para mantener la coherencia de la tabla.
========================================================*/
/*========================================================*/
void eliminar_procedimientos (TABSIM tabla,
int nivel);
/*========================================================
Elimina de la tabla todas los procedimientos de un nivel.
IMPORTANTE: Los parametros ocultos de estos procedimientos
deben ser eliminados para mantener la coherencia de la
tabla.
========================================================*/
/*========================================================*/
void eliminar_funciones (TABSIM tabla,
int nivel);
/*========================================================
Elimina de la tabla todas las funciones de un nivel.
IMPORTANTE: Los parametros ocultos de estas funciones deben
ser eliminados para mantener la coherencia de la tabla.
-8-
Compiladores I
3 Convocatoria 96/97 (12-IX-97)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
========================================================*/
/*========================================================*/
char *valor(TABSIM tabla,
char *identificador);
/*========================================================
Devuelve un puntero a un string con el contenido del
s'imbolo. Depende del usuario tratar posteriormente de
acuerdo con el tipo. Si el simbolo no se encuentra en
la tabla, el valor queda indefinido
========================================================*/
/*========================================================*/
void mostrar_tabla (TABSIM tabla);
/*========================================================
Muestra en pantalla el contenido de la tabla de simbolos.
Los simbolos aparecen agrupados segun su posicion en la
lista de colision de cada elemento de la tabla hash. Para
cada simbolo se da informacion del nombre de su
identificador, el tipo de simbolo, el tipo de variable, la
clase de variable, el nivel del simbolo y la direccion
asignada.
IMPORTANTE: Para cada procedimiento o funcion se da tambien
informacion de los parametros que le han sido asociados.
Asi que los simbolos de tipo parametro aparecen DOS VECES en
la descripcion del contenido de la tabla. Sinembargo, en la
tabla aparecen una sola vez.
========================================================*/
-9-
Compiladores I
1 Convocatoria 97/98 (31-I-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
-1-
Compiladores I
1 Convocatoria 97/98 (31-I-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Se pide definir los atributos y escribir las acciones que se consideren oportunas
para insertar los parmetros en la tabla.
-2-
Compiladores I
1 Convocatoria 97/98 (31-I-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Ejercicio 2 (4.0 ptos.): Proveniente de una mala exportacin de datos de una base
de datos, disponemos de dos ficheros de texto: datos.txt y memos.txt. El
primero de ellos contiene la informacin de los campos de una base de
almacenamiento de topnimos; el segundo,
contiene informacin
complementaria para algunos de los registros contenidos en el fichero inicial.
El siguiente ejemplo muestra parte del fichero de datos:
#ABAD DE AYE.,PIA.DEL BENEFICIO#,#ABAD DE AYE.,PIA DEL
BENEFICIO#,1591,#ZARE#,#OIBARRIBAR#,#PRA#,#JUAN DE
SOLA(ZAHARRA)#,#OIBAR#,#K.5(1591)#,1
#ABAD VIEJO,CASA#,#ABBAD
BIEJO,CASSA#,1654,#ZOROKIAIN#,#UNTZITIBAR#,#PRA#,#M.VERA(GAZTEA)
#,#ELO#,#2.K
-BIS(1652-56)#,13059
#ABAD,CORRALES DEL#,#ABBAD,CORRALES
DEL#,1585,#ZARE#,#OIBARRIBAR#,#PRA#,#JUAN DE
SOLA(ZAHARRA)#,#OIBAR#,#K.3-BIS(1585-7)#,2
#ABAD,PIEZA DEL#,#ABBAD,PIEZA
DEL#,1591,#EZPOROGI#,#OIBARRIBAR#,#PRA#,#JUAN
DE SOLA(ZAHARRA)#,#OIBAR#,#K.5(1591)#,3
#ABAD,PIEZAS DEL#,#ABAD,PIAS
DEL#,1591,#EZPOROGI#,#OIBARRIBAR#,#PRA#,#JUAN
DE SOLA(ZAHARRA)#,#OIBAR#,#K.5(15191)#,9900
#ABADIA#,#ABADIA#,1897,#EPAIZ#,#OIBARRIBAR#,##,##,##,#1897KO
KATASTROA#,
#ABADIA DE ABAIZ,PIEZAS DE LA#,#ABADIA DE ABAIZ,PIEZAS DE
LA#,1824,#ESLABA#,#OIBARRIBAR#,#PRA#,#ANTONIO ORTIZ#,#SAN MARTIN
UNX#,#K.84(1824-25)#,9630
Compiladores I
1 Convocatoria 97/98 (31-I-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
#ABAD VIEJO,CASA#
#ABBAD
BIEJO,CASSA#
c3:
1654
c4:
#ZOROKIAIN#
c5:
#UNTZITIBAR#
c6:
#PRA#
c7:
#M.VERA(GAZTEA)#
c8:
#ELO#
c9:
#2.K
-BIS(1652-56)#
c10: 13059
Notar que:
1) Los campos van separados por una coma
2) Todos los campos, excepto los numricos (ao e ndice), se encuentran
delimitados por # (estos caracteres no forman parte del contenido del campo,
sino que han sido introducidos al exportar los datos de la base antigua, y
debern ser eliminados en el momento de llevar a cabo la transformacin de
formatos)
3) Siempre hay al menos un salto de lnea despus de cada registro
4) Debido a una mala introduccin de datos, algunos campos no numricos
contienen tabuladores y saltos de lnea; en el momento de cambiar los
formatos, los tabuladores y saltos de lnea dentro de campos debern ser
cambiados por un blanco
-4-
Compiladores I
1 Convocatoria 97/98 (31-I-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
E
O
, O
3 horas
-5-
Compiladores I
2 Convocatoria 97/98 (3-VII-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
Huesca
t1
t2
Zaragoza
Madrid
t4
t6
t5
t3
Pamplona
Una herramienta grfica que es capaz de dibujar autmatas de esta clase genera
una descripcin textual del autmata, con el fin de que pueda ser utilizada por
otros programas. La descripcin que se acaba de citar, adems de la informacin
estrictamente necesaria, saca otro tipo de informacin que no tiene, en un
principio, nada que ver con la propia descripcin del autmata.
Para el autmata de la figura la salida de la herramenta de edicin se presenta
en el apndice que puedes encontrar al final del enunciado.
Si bien la descripcin contiene informacin redundante, hay que decir que toda
la informacin necesaria para conocer el autmata se encuentra entre las lneas
*** Start of TRG ***
y
*** End of TRG ***
Veamos con ms detalle algunos elementos de la descripcin.
5 Tangible Markings
el autmata tiene 5 estados
From #1 .....
el estado inicial del autmata es siempre el primero en ser descrito
From #5 (1 timed trans)
[ Pamplona ]
-Timed-> t3 -to_tang-> #3
-1-
Compiladores I
2 Convocatoria 97/98 (3-VII-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
3)
-2-
Compiladores I
2 Convocatoria 97/98 (3-VII-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
3 horas
-3-
Compiladores I
2 Convocatoria 97/98 (3-VII-98)
4 Ing. Informtica. C.P.S. Universidad de Zaragoza
[ Vitoria ]
-4-
Compiladores I
G2
A =A
A =
A =B
B =B
B =
S =uBDz
B =Bv
B =w
D =EF
E =y
E =
F =x
F =
-1-
Compiladores I
3 horas
-2-
Compiladores I
1.1)
1.2)
1.3)
Compiladores I
1.4)
1.5)
-2-
Compiladores I
void main(){
x = cx + 27.000000;
y = 64.000000;
x = cy * (x + y);
printf("%f\n", x);
y = 2.000000 * x;
printf("%f\n", 2.000000 * y + y);
}
Notar que:
1)
2)
3)
2.2)
2.3)
#1#
Compiladores I
......
#1#
float elVal;
.......
Notas:
No olvides entregar el Anexo II numerado
El tiempo es parte del examen, por lo que ste se recoger
exactamente 2:30 horas despus de ser entregado
2:30 horas
-4-
Compiladores I
-5-
Compiladores I
instruccion:
instAsignacion ';'
| instEscritura ;'
;
instEscritura:
tkESCRIBIR expr
;
instAsignacion:
tkID '=' expr
;
expr:
term
| '+' term
| '-'
| expr opSum term
;
opSum:
'+'
| '-'
;
term:
factor
| term opMul factor
;
opMul:
'*'
| '/'
;
factor:
tkID
| tkREAL
| '(' expr )';
%%
main()
{
yyparse();
}
-6-
Compiladores I
4 Ing. Informtica
{/*-SEIS-*/}
{/*-SIETE-*/}
{/*-OCHO-*/}
Las reglas de tipo para las expresiones de la gramtica son las siguientes:
*
Compiladores I
4 Ing. Informtica
*
*
*
-2-
Compiladores I
4 Ing. Informtica
-3-
Compiladores I
4 Ing. Informtica
2:00 horas
-4-
Compiladores I
1. (1.50 Ptos.) Escribir una gramtica Yacc que genere dicho lenguaje,
teniendo en cuenta que el analizador lxico que utiliza es el
mostrado en el anexo
2. (0.75 Ptos.) Generar el rbol de sintaxis para el programa mostrado,
de acuerdo con la gramtica que habeis escrito en el apartado
anterior
3. (0.5 Ptos.) De acuerdo con el analizador lxico. Es correcto
"\\\"Hola\"" como lexema para una cadena? Por qu? Cul
sera el valor de la variable filtrada una vez ejecutada la
instruccin filtra(yytext,filtrada)?
4. (0.5 Ptos.) De acuerdo con el analizador lxico. Es correcto
"\\\"Hola\" como lexema para una cadena ? Por qu? Cul
sera el valor de la variable filtrada una vez ejecutada la
instruccin filtra(yytext,filtrada)?
5. (1.75 Ptos.) Completar la gramtica de manera que, asociado al
smbolo que corresponda a una expresin, se sintetice un atributo
denominado "valExp" con el valor de la expresin (que ser la
cadena resultante de las concatenaciones involucradas en la
expresin, una vez filtradas adecuadamente).
6. (2.0 Ptos.) Construir las tablas y el autmata del anlisis SLR(1) para
la gramtica definida
7. (1.0 Ptos.) Imaginemos que se aade una nueva instruccin al
lenguaje anterior (la instruccin "print" de semntica parecida a la
-1-
Compiladores I
2:15 horas
-2-
Compiladores I
%{
/*-------------------------------------------------y.tab.h contiene la definicin de los tokens
tkSTART tkEND tkPRINTLN tkCAD
--------------------------------------------------*/
#include "string.h"
#include "y.tab.h"
extern char filtrada[256];
void filtra(char *cOr,char *cDes){
int i = 1,
j = 0;
while(i <= strlen(cOr)-2){
if(cOr[i] != '\\'){
cDes[j] = cOr[i];i++;j++;
}else{
if(i == strlen(cOr) -2){
cDes[j] = cOr[i];i++;j++;
}else{
if (cOr[i+1] == '"'){
cDes[j] = '"';i += 2;j++;
}else{
cDes[j] = cOr[i];i++;j++;
}
}
}
}
cDes[j] = '\0';
}
%}
separadores
%%
{separadores}
"start"
"end"
"println"
\"([^\"\t\n]|\\\")*\"
.
%%
([\t \n])+
{}
{return(tkSTART);}
{return(tkEND);}
{return(tkPRINTLN);}
{filtra(yytext,filtrada);
return(tkCAD);}
{return(yytext[0]);}
-3-
Compiladores I
->
->
->
->
->
->
30
102
229
0
20
3
-1-
Compiladores I
lista :
'(' op listSE ')'
;
op :
'+'
| '*'
;
listSE :
listSE SE
| SE
;
SE :
NUMERO
| lista
;
%%
10
15
11
13
12
14
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Compiladores I
2:15 horas
-3-
Compiladores I
^6 )
5.0X
^6 ) + (-1.0 +3.0X^3 )
2:15 horas
Compiladores I
A
a b c d
a C d
B d
c
2:15 horas
Compiladores I
Se pide:
Completar el autmata LALR que se muestra a continuacin,
definiendo los conjuntos de configuraciones que deben aparecer en
los nodos
Escribir las tablas ir_a y accin correspondientes al anlisis LALR
2:15 horas
Compiladores I
2:15 horas
Compiladores I
la invocacin calcula
stdout:
Compiladores I
Compiladores I
Se pide:
Completar el autmata SLR(1) que se muestra a continuacin,
definiendo los conjuntos de configuraciones que deben aparecer en
los nodos
Escribir las tablas ir_a y accin correspondientes al anlisis
SLR(1)
Notas
1. El examen se punta sobre 8; las prcticas se puntan sobre 2
2. Para aqullos que aprobaran las prcticas en el curso anterior, el
examen se puntuar sobre 10.
Tiempo total para el examen:
2:15 horas
Compiladores I
-->
-->
-->
-->
-->
-->
C
b
S
e
E
g
B a | D
b C
c | d d d
A| f | C
| S A B C
h
8)
2:30 horas
Compiladores I
l := resto(resto(lP));
l := ponPrimero(l,n);
escribir(resto(lP));
l := ponPrimero(l,n);
escribir(l);
Fin.
#lP=(2
#lP=(2
#lP=(2
#lP=(2
#lP=(2
3),l=(),n=N
3),l=(N),n=N
3),l=(N),n=N,en stdout (3)
3),l=(N N),n=N
3),l=(N N),n=N,en stdout (N N)
2:30 horas
Compiladores I
2:30 horas
Compiladores I
-->
-->
-->
-->
X2
a2
a3
a4
X2 X2
| X3
| X4
| X5
--> an-1 | Xn
--> an
2:45 horas
Compiladores I
2:45 horas
Compiladores I
2:45 horas
Compiladores I
Anexo-I
M:Nx(T{})2P:tabla de anlisis sintctico LL(1)
La frase a analizar termina con $
Post: Muestra la secuencia de producciones aplicadas en
el anlisis o ERROR
Pre:
2:45 horas
Compiladores I
2:45 horas
Compiladores I
A B
B
B '*'
'(' A ')'
'x'
Se pide:
1. Construir el autmata y las tablas del anlisis LALR(1)
2. Tranformarla en una equivalente que sea LL(1), y calcular la tabla
del anlisis LL(1) de la transformada
Ejercicio 4 (3.0 ptos.): Un grafo dirigido se define como una estructura
compuesta por dos tipos de elementos, arcos y nodos. Los arcos son
pares formados por nodos. Tanto arcos como nodos pueden tener
informacin asociada.
La figura 2 muestra la descripcin textual del grafo de la figura 1 (que en
este caso es un autmata finito) que genera una herramienta para la
manipulacin de grafos dirigidos.
2:45 horas
Compiladores I
0-9
0-9
0-9
.
4
0-9
0-9
Figura 1: Un autmata
numeroReal
graph [
node [
id 1
parameter
]
node [
id 2
parameter
]
node [
id 3
parameter
]
node [
id 4
parameter
]
node [
id 5
parameter
]
edge [
source 1
target 2
parameter
]
edge [
source 1
target 4
parameter "."
"inicial"
""
"final"
""
"final"
"0-9"
]
]
edge [
source 2
target 2
parameter
]
edge [
source 2
target 3
parameter
]
edge [
source 3
target 3
parameter
]
edge [
source 4
target 5
parameter
]
edge [
source 5
target 5
parameter
]
"0-9"
"."
"0-9"
"0-9"
"0-9"
2:45 horas
Compiladores I
2:45 horas
Compiladores I
1. Qu lenguaje genera?
2. Construir el autmata y las tablas del anlisis LALR(1).
3. Est claro que no es una gramtica LL(1). Tranformarla en una
equivalente que s lo sea, y probar formalmente que la transformada
es de la clase LL(1).
Ejercicio 3 (4.0 ptos.): Los anexos I y II contienen los fuentes
(incompletos) Flex y Bison de un programa para la evaluacin del tipo
de expresiones aritmticas sencillas. En lugar de hacer una evaluacin
al vuelo del atributo TIPO, se va a hacer mediante la construccin y
posterior evaluacin del rbol de sintaxis correspondiente a la expresin.
El tipo de una operacin binaria (+, -, *, /) se determina como sigue a
partir de los tipos de sus operandos: si ambos operandos son enteros, el
resultado es ENTERO; si ambos son reales, el resultado es REAL; si son
de tipos distintos, el tipo del resultado es DESCONOCIDO. Las figuras 1
y 2 muestran un ejemplo de rbol de sintaxis para una expresin una vez
ha sido generado y despus de sintetizar el atributo de tipo,
respectivamente. Para ello se utiliza el TAD especfico definido en el
anexo III.
El ejercicio pide:
Completar los puntos /* 1 */ a / * 8 */ de los anexos I y II de forma
que se genere el rbol de sintaxis.
Escribir el cdigo de la funcin
TIPOS_ESCALARES evaluaTipo(ptArbolSintaxis p)
2:30 horas
Compiladores I
laExp
(EXPR,*,*,
(OP_BIN,*,*,
(EXPR,*,*,
,NULL)
(TERMINO,*,*,
,NULL)
(FACTOR,*,*,
,NULL)
,NULL)
(TERMINO,*,*,
,NULL)
(FACTOR,*,*,
,NULL)
(CONST_REAL,*,*,NULL,NULL)
(CONST_ENT,*,*,NULL,NULL)
2:30 horas
Compiladores I
(EXPR,DESCONOCIDO,*,
,NULL)
(OP_BIN,DESCONOCIDO,*,
(EXPR,ENTERO,*,
,NULL)
(TERMINO,ENTERO,*,
,NULL)
(FACTOR,ENTERO,*,
,NULL)
(TERMINO,REAL,*,
,NULL)
(FACTOR,REAL,*,
,NULL)
(CONST_REAL,REAL,*,NULL,NULL)
(CONST_ENT,ENTERO,*,NULL,NULL)
2:30 horas
Compiladores I
ANEXO-I
%{
#include "y.tab.h"
#include "arbolSintaxisExp.h"
%}
/*EXPRESIONES REGULARES*/
separadores
[\t ]+
digito
[0-9]
letra
[a-zA-Z]
constEntera
{digito}+
constReal
{constEntera}"."{constEntera}
%%
{separadores} {/*nada*/}
{constReal} {
/* 1 */
return(tkREAL);}
{constEntera}
{
/* 2 */
return(tkENTERO);}
\n
{/*nada*/}
.
{return(yytext[0]);}
%%
2:30 horas
Compiladores I
ANEXO-II
%{
#include <stdio.h>
#include <stdlib.h>
#include "arbolSintaxisExp.h"
ptArbolSintaxis laExp;
%}
%union{
ptArbolSintaxis elArbol;
}
%token <elArbol>tkREAL
%token <elArbol>tkENTERO
%type <elArbol>expr
%type <elArbol>term
%type <elArbol>factor
%type <elArbol>term
%left '-' '+'
%left '*' '/'
%%
expr:
term
{ /* 3 */ }
| expr opSum term
{ /* 4 */ }
;
opSum:
'+'
| '-'
;
term:
factor
{ /* 5 */ }
| term opMul factor
{ /* 6 */ }
;
opMul:
'*'
| '/'
;
factor:
tkREAL
{ /* 7 */ }
| tkENTERO
{ /* 8 */ }
;
%%
int main()
{ TIPOS_ESCALARES elTipoFinal;
yyparse();
elTipoFinal = evaluaTipo(laExp);
printf("Tipo de la expresin: ");
muestraTipo(elTipoFinal);
liberaArbol(laExp);
exit(0);
2:30 horas
Compiladores I
ANEXO-III
/*================================================================
Fichero: arbolSintaxisExp.h
Tema:
TAD para el manejo de rboles de sintaxis de expresiones
simples
Version: 1.0
Fecha:
Jumio-02
Autor:
Joaquin
Com.:
Ejercicio para construir rboles de sintaxis
=================================================================*/
typedef enum {
OP_UN,OP_BIN,CONST_ENT,CONST_REAL,EXPR,TERMINO,FACTOR
} CLASE_DE_NODO;
typedef enum {ENTERO,REAL,DESCONOCIDO} TIPOS_ESCALARES;
typedef struct NODO {
CLASE_DE_NODO laClaseDeNodo;
TIPOS_ESCALARES elTipo;
union {
float valReal;
int valEnt;
} elValor;
struct NODO *expDcha;
struct NODO *expIzda;
} arbolSintaxis,*ptArbolSintaxis;
ptArbolSintaxis creaArbol(CLASE_DE_NODO laClase);
/* Pre:
Post: creaArbol = (laClase,*,*,NULL,NULL)
*/
void liberaArbol(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = NULL, la memoria ocupada por los elementos
del rbol se ha liberado
*/
void ponElTipo(ptArbolSintaxis p,TIPOS_ESCALARES t);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,t,eV,eI,eD)
*/
void ponValorReal(ptArbolSintaxis p,float r);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,eT,r,eI,eD)
*/
void ponValorEntero(ptArbolSintaxis p,int n);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,eT,n,eI,eD)
*/
void ponExpIzda(ptArbolSintaxis p,ptArbolSintaxis e);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,eT,eV,e,eD)
*/
void ponExpDcha(ptArbolSintaxis p,ptArbolSintaxis e);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,eT,eV,eI,e)
*/
void ponClaseDeNodo(ptArbolSintaxis p,CLASE_DE_NODO c);
2:30 horas
Compiladores I
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (c,eT,eV,eI,eD)
*/
CLASE_DE_NODO dameLaClaseDeNodo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameLaClaseDeNodo = lC
*/
TIPOS_ESCALARES dameElTipo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameElTipo = eT
*/
ptArbolSintaxis dameSubexpIzda(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameSubexpIzda = eI
*/
ptArbolSintaxis dameSubexpDcha(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameSubexpDcha = eD
*/
TIPOS_ESCALARES evaluaTipo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: sintetiza el atributo elTipo para cada uno de los nodos del
rbol,
evaluaTipo = el tipo del nodo raz (ver enunciado)
*/
void muestraTipo(TIPOS_ESCALARES t);
/* Pre:
Post: imprime en stdout informacin sobre el tipo t
*/
2:30 horas
Compiladores I
tkENTERO;
tkID;
exp '+' exp;
tkID '(' exp ')';
2:00 horas
Compiladores I
2:00 horas
Compiladores I
02:45
Compiladores I
polinomio(&elPol);
escribePol(&elPol);
fprintf(stdout,Anlisis correcto\n);
}
02:45
Compiladores I
02:45
Compiladores I
ANEXO-I
state 0
0 $accept: . S $end
q
','
S
A
C
state 1
3 A: q .
$default
state 2
5 C: ',' . D
u
go to state 7
state 3
0 $accept: S . $end
$end
state 4
1 S: A . B
n
go to state 10
state 5
02:45
Compiladores I
state 6
7 D: u .
8 | u . ',' D
','
$default
state 7
5 C: ',' D .
$default
state 8
0 $accept: S $end .
$default
accept
state 9
4 B: n . C
','
C
state 10
1 S: A B .
$default
state 11
02:45
Compiladores I
8 D: u ',' . D
u
go to state 13
state 12
4 B: n C .
6 C: C .
$end
$end
$default
state 13
8 D: u ',' D .
$default
02:45
Compiladores I
El ejercicio pide:
Qu lenguaje genera?
Obtener la tabla del anlisis LL(1), y concluir si se trata de una
gramtica de esa clase.
Obtener el autmata y las tablas del anlisis LALR(1), y determinar
si se trata de una gramtica de la clase LALR (1) o no.
Ejercicio 2 (2.0 ptos.): Considerar la siguiente gramtica libre de
contexto, denominada G:
%token
%%
S: b A
A: a b
B: b a
a b
| a B |;
a S;
b S;
El ejercicio pide:
Se trata de una gramtica regular ? (una gramtica es regular si el
lenguaje que genera es un lenguaje regular).
Si es una gramtica regular, dar un autmata finito determinista
mnimo cuyo lenguaje sea el mismo que el generado por dicha
gramtica. Dar tambin la expresin regular correspondiente a
dicho autmata.
02:15
Compiladores I
02:15
Compiladores I
(OP_BIN,?,?,
(EXPR,?,?,
(TERMINO,?,?,
(FACTOR,?,?,
,NULL)
,NULL)
,NULL)
,NULL)
(TERMINO,?,?,
(FACTOR,?,?,
,NULL)
,NULL)
(CONST_REAL,?,?,NULL,NULL)
(CONST_ENT,?,?,NULL,NULL)
02:15
Compiladores I
laExp
(EXPR,DESCONOCIDO,?,
,NULL)
(OP_BIN,DESCONOCIDO,?,
(EXPR,ENTERO,?,
,NULL)
(TERMINO,ENTERO,?,
,NULL)
(FACTOR,ENTERO,?,
,NULL)
(TERMINO,REAL,?,
,NULL)
(FACTOR,REAL,?,
,NULL)
(CONST_REAL,REAL,?,NULL,NULL)
(CONST_ENT,ENTERO,?,NULL,NULL)
02:15
Compiladores I
ANEXO-I
%{
#include "y.tab.h"
#include "arbolSintaxisExp.h"
%}
/*EXPRESIONES REGULARES*/
separadores
[\t ]+
digito
[0-9]
letra
[a-zA-Z]
constEntera
{digito}+
constReal
{constEntera}"."{constEntera}
%%
{separadores} {/*nada*/}
{constReal} {
/* 1 */
return(tkREAL);}
{constEntera}
{
/* 2 */
return(tkENTERO);}
\n
{/*nada*/}
.
{return(yytext[0]);}
%%
02:15
Compiladores I
ANEXO-II
%{
#include <stdio.h>
#include <stdlib.h>
#include "arbolSintaxisExp.h"
ptArbolSintaxis laExp;
%}
%union{
ptArbolSintaxis elArbol;
}
%token <elArbol>tkREAL
%token <elArbol>tkENTERO
%type <elArbol>expr
%type <elArbol>term
%type <elArbol>factor
%type <elArbol>term
%left '-' '+'
%left '*' '/'
%%
expr:
term
{ /* 3 */ }
| expr opSum term
{ /* 4 */ }
;
opSum:
'+'
| '-'
;
term:
factor
{ /* 5 */ }
| term opMul factor
{ /* 6 */ }
;
opMul:
'*'
| '/'
;
factor:
tkREAL
{ /* 7 */ }
| tkENTERO
{ /* 8 */ }
;
%%
int main(){
TIPOS_ESCALARES elTipoFinal;
yyparse();
elTipoFinal = evaluaTipo(laExp);
02:15
Compiladores I
02:15
Compiladores I
ANEXO-III
/*============================================================
Fichero: arbolSintaxisExp.h
Tema:
TAD para el manejo de rboles de sintaxis de
expresiones simples
Version: 1.0
Fecha:
Junio-02
Autor:
J.E.
Com.:
Ejercicio para construir rboles de sintaxis
============================================================*/
typedef enum {
OP_UN,OP_BIN,CONST_ENT,CONST_REAL,EXPR,TERMINO,FACTOR
} CLASE_DE_NODO;
typedef enum {ENTERO,REAL,DESCONOCIDO} TIPOS_ESCALARES;
typedef struct NODO {
CLASE_DE_NODO laClaseDeNodo;
TIPOS_ESCALARES elTipo;
union {
float valReal;
int valEnt;
} elValor;
struct NODO *expDcha;
struct NODO *expIzda;
} arbolSintaxis,*ptArbolSintaxis;
02:15
Compiladores I
Post: p = (lC,eT,eV,e,eD)
*/
void ponExpDcha(ptArbolSintaxis p,ptArbolSintaxis e);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (lC,eT,eV,eI,e)
*/
void ponClaseDeNodo(ptArbolSintaxis p,CLASE_DE_NODO c);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: p = (c,eT,eV,eI,eD)
*/
CLASE_DE_NODO dameLaClaseDeNodo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameLaClaseDeNodo = lC
*/
TIPOS_ESCALARES dameElTipo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameElTipo = eT
*/
ptArbolSintaxis dameSubexpIzda(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameSubexpIzda = eI
*/
ptArbolSintaxis dameSubexpDcha(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: dameSubexpDcha = eD
*/
TIPOS_ESCALARES evaluaTipo(ptArbolSintaxis p);
/* Pre:
p = (lC,eT,eV,eI,eD)
Post: sintetiza el atributo "elTipo" para cada uno de
los nodos del rbol,
evaluaTipo = el tipo del nodo raz (ver enunciado)
*/
void muestraTipo(TIPOS_ESCALARES t);
/* Pre:
Post: imprime en stdout informacin sobre el tipo t
*/
02:15
Compiladores I
nomFich
generaReconocedor
nomFich_ER
nomFichER
02:45
Compiladores I
02:45
Compiladores I
2:30 horas
Compiladores I
2:30 horas
Compiladores I
Las reglas de tipo para las expresiones de la gramtica son las siguientes:
1. Slo se pueden sumar enteros; el resultado es un entero.
2. El operador AND slo se puede aplicar sobre booleanos; el
resultado es un booleano.
3. El operador de igualdad '=' slo puede aplicarse sobre elementos
del mismo tipo, y su resultado es siempre un booleano.
4. En el caso de que aparezca un error de tipos durante la traduccin
(es decir, se viole alguna de las reglas anteriores), el tipo de la
expresin ser error.
La gramtica considerada es LL(1). El ejercicio pide escribir un
analizador descendente recursivo que sintentice el tipo de la expresin
y, en caso de ser ste correcto, tambin su valor. Para ello hay que:
escribir un fuente Flex apropiado, entendiendo que debe devolver
BOOLEANO cuando encuentra true o false (sin distinguir maysculas
de minsculas) y ENTERO cuando encuentra una secuencia de uno o
ms dgitos (no vamos a considerar la posibilidad de enteros con
signo). Adems, se salta los separadores habituales. En cualquier otro
caso devuelve el primer carcter encontrado.
completar el fuente C que sigue, de manera que lleve a cabo el anlisis
solicitado. Ntese que esto implica desarrollar tambin el cdigo del
procedimiento "evaluaExp", as como las macros "EL_TIPO" y
Tiempo total para el examen:
2:30 horas
Compiladores I
elToken = yylex();
exp(&aSConcreta);
evaluaExp(&aSConcreta); /*completa los atributos necesarios*/
switch(EL_TIPO(aSConcreta)){
case BOOL: printf(
"Tipo: booleano. Valor: %1d\n",EL_VAL(aSConcreta));
break;
case ENT: printf(
"Tipo: entero Valor: %1d \n", EL_ VAL(aSConcreta));
break;
case ERROR: printf(
"Tipo: error Valor: indefinido\n");
break;
}
liberaArbol(&aSConcreta);
exit(1);
Ejercicio 2 (1.0 ptos.): Sea G una gramtica libre de contexto, y sea A uno
de sus smbolos no terminales. Si
A --> A1 | A2 | ... | An
2:30 horas
Compiladores I
2:30 horas
Compiladores I
Anexo-I
/*********************************************************
Fichero: arbNArio.h
Tema:
especificacin TAD arbol n-ario genrico
Fecha:
Septiembre-03
Uso:
Para usar en COMPI
**********************************************************/
#define MAX_HIJOS 12
2:30 horas
Compiladores I
2:30 horas
Compiladores I
2:30 horas
Compiladores I
Estado 1
Estado 6
Estado 2
Estado 3
Estado 4
Estado 5
Estado 7
Estado 8
Estado 9
Estado 10
Compiladores I
rbol
entrada
accin
Compiladores I
2.A) Para ella, construir completa la tabla del anlisis LL(1), y concluir si se
trata de una gramtica de esa clase o no.
2.B) Transformar dicha gramtica en una equivalente sin (una gramtica
G se dice sin cuando cumple que si no es del lenguaje, no hay ninguna
produccin epsilon, y si es del lenguaje, la gramtica contiene S -> como
nica produccin epsilon).
Ejercicio 3 (2.0 ptos.): Sea L un lenguaje independiente de contexto (es decir,
generado por una gramtica independiente libre- de contexto). Probar que
L* es tambin un lenguaje independiente de contexto.
Ejercicio 4 (2.0 ptos.): Se desea implementar un programa que procese lotes
de futuras transacciones bancarias sobre una cuenta concreta y determine si
dicho lote es aceptable o no. Un lote es aceptable si en ningn momento entra
en nmeros rojos (es decir, la cantidad de la cuenta es inferior a cero). Las
transacciones pueden ser de dos tipos: ingresos o cargos de cantidades
naturales (es decir, cantidades mayores o iguales a 0). El fichero de entrada
para un lote de transacciones tiene el siguiente formato: la primera lnea
establece el saldo actual de una cuenta mediante el trmino "Saldo
inicial:", seguido de un entero no negativo, que indica el saldo. La lneas
siguientes representan transacciones: valores negativos representan cargos,
valores positivos indican ingresos. Un ejemplo de fichero de lote de
transacciones a procesar puede ser el siguiente:
Saldo inicial: 34567
+ 1000
-300
500
+100
Compiladores I
El
ejercicio
pide
completar
el
siguiente
fuente
Bison
("procesaTransacciones.y") con las acciones necesarias para que su
comportamiento sea el especificado. (Nota: no est permitido utilizar
Compiladores I
Compiladores I
Se pide:
2A) Rellenar el contenido de los estados del autmata LR(1).
Estado 0
Estado 1
Estado 11
Estado 3
Estado 6
Estado 2
Estado 5
Estado 4
a
Estado 7
Estado 8
Estado 10
Estado 9
Estado 13
Estado 12
Compiladores I
Estado 0
Estado 1
Estado 2
Estado 3
Estado 4
Estado 5
Estado 6
Estado 7
Estado 8
Estado 9
Estado 10
Estado 11
Estado 12
Estado 13
2C) Realizar los pasos necesarios para analizar la cadena de entrada aacb.
Compiladores I
Pila
rbol
entrada
Accin
Compiladores I
{/*saltarlo*/}
{yylval.valCant = atoi(yytext); return tkNumero;}
{return tkNil}
%{
#include <stdio.h>
%}
%union{
struct{
. . .
/*completar con ms atributos, si se considera necesario */
int estaOrdenado; /*1 si est ordenado, 0 en caso contrario */
}atributosArbol;
int valCant;
}
%start arbol
%token <valCant> tkNumero
%token tkNil
%type <atributosArbol> arbol
%%
arbol:
tkNumero arbol arbol
|
tkNil
%%
int main(){
yyparse();
exit(0);
}
{ . . . };
{ . . . };
Compiladores I
Estado 1
Estado 6
Estado 2
Estado 3
Estado 8
Estado 4
Estado 5
Estado 7
Estado 9
Estado 10
Compiladores I
Estado 7
Estado 8
Estado 9
Estado 10
rbol
entrada
accin
Compiladores I
5.0X
^6
Compiladores I
5.0X
^6
%%
spec:
tkMARCA reglas
;
reglas: tkIDENTDP
| reglas
resto
regla
prec
;
regla:
;
resto:
| resto tkIDENT
| resto accion
;
accion: tkACCIONC
Compiladores I
prec:
| tkPREC tkIDENT
| tkPREC tkIDENT accion
| prec ';'
;
%%
int main(int argc, char *argv[]){
FILE *fin;
extern FILE *yyin;
if (argc == 2) {
if ((fin = fopen(argv[1],"r")) == NULL) {
fprintf(stderr,"ERROR: no se pudo abrir el fichero!\n");
exit(-1);
}
} else {
fprintf(stderr, "La invocacion debe ser: %s <fichero_fuente>\n,
argv[0]);
exit(1);
}
yyin = fin;
yyparse();
exit(0);
}
Compiladores I
Estado 0
Estado 1
Estado 3
R
Estado 8
Estado 4
*
Estado 13
Estado 8
Estado 9
Estado 5
Estado 2
Estado 10
Estado 6
Estado 11
Estado 12
03:00
Compiladores I
Estado 0
Estado 1
Estado 2
Estado 3
Estado 4
Estado 5
Estado 6
Estado 7
Estado 8
Estado 9
Estado 10
Estado 11
Estado 12
Estado 13
03:00
Compiladores I
pila
rbol
entrada
accin
03:00
Compiladores I
Ejercicio 4 (3 ptos.):
Las siguientes especificaciones (en FLEX y BISON) tienen como objetivo
realizar conjuntamente el anlisis sintctico de fuentes simplificados de
BISON.
4.A) Notar que el fuente FLEX no est completo porque no devuelve el
token tkACCIONESC. Completar la especificacin FLEX para que salte
las acciones C y le proporcione al analizador sintctico el token
tkACCIONESC.
%{
#include <stdio.h>
#include "y.tab.h"
%}
ID
[a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])*
%%
(\t|\n|" ")+
{}
{ID}
"'".|\n"'"
"%%"
{ return tkID; }
{ return tkID; }
{ return tkMARCA;}
{ return yytext[0]; }
03:00
Compiladores I
%{
#include <stdio.h>
%}
%token
tkID
%%
....
spec :
tkMARCA
;
reglas :
regla
| reglas
;
tkACCIONESC tkMARCA
reglas
regla
regla :
parteIzq ':' listaPartesDchas ';'
;
parteIzq :
noTerminal
;
listaPartesDchas :
parteDcha
| listaPartesDchas '|' parteDcha
;
parteDcha :
simbGramMasAcciones
| parteDcha simbGramMasAcciones
;
simbGramMasAcciones:
accionesc
| noTerminal accionesc
| terminal accionesc
;
accionesc :
| '{' tkACCIONESC '}'
;
noTerminal:
tkID;
;
terminal:
tkID;
;
%%
int main(int argc, char *argv[]){
FILE *fin;
extern FILE *yyin;
if (argc == 2) {
if ((fin = fopen(argv[1],"r")) == NULL) {
fprintf(stderr,"ERROR: no se pudo abrir el fichero!\n");
exit(-1);
03:00
Compiladores I
yyparse();
exit(0);
}
03:00
Compiladores I
1) S A
2) S x b
3) A a A b
4) A B
5) B x
1.A) Se pide completar el siguiente autmata, que se corresponde al anlisis
SLR(1).
Estado 0
Estado 1
Estado 2
A
Estado 3
Estado 4
Estado 5
Estado 6
Estado 9
Estado 7
Estado 8
Compiladores I
Estado 0
Estado 1
Estado 2
Estado 3
Estado 4
Estado 5
Estado 6
Estado 7
Estado 8
Estado 9
1.D) Se pide por ltimo completar la secuencia de estados por los que pasara
el anlisis SLR(1) cuando se aplica el procesamiento de la secuencia a x b.
entrada
pila
rbol
accin
Compiladores I
S a S
| a S b S
|
Ejercicio 3 (1.0 pto.): Consderese el alfabeto ={a b c}. Una cadena w de longitud
mayor o igual a 1 se dice que es un palndromo si se lee igual de derecha a izquierda
que de izquierda a derecha. El ejercicio pide escribir una gramtica independiente de
contexto G=(N,T,S,P) que genere como lenguaje el conjunto de palndromos de .
Ejercicio 4 (1.0 ptos.): Considrese la siguiente gramtica G:
S a S
| S b
| a
| b
Probar que ninguna cadena w perteneciente al lenguaje generado por la
gramtica, L(G), puede contener la cadena b a como subcadena.
Compiladores I
La ejecucin de
> calculadorai miFicheroDeExpresionesComplejas
generar la salida:
Resultado:
9.0+23.0i
Resultado:
199.0+71.0i
Resultado:
100.0+3.0i
Resultado:
-14.1+0.0i
Notar que cada lnea de resultado se corresponde con una de las lneas de
expresiones.
A partir del fuente Bison que se proporciona a continuacin se pide:
5.A) Escribir el fuente Flex que le proporcione los tokens necesarios y le
permita realizar la evaluacin de expresiones complejas.
5.B) Completar el fuente Bison dado, para que realice los clculos y muestre el
resultado por la salida estndar.
% token
tkREAL
% token
tkNUMEROI /* el nmero i*/
% left '+' '-'
% left '*'
%%
calc_expresiones: calc_expresiones '\n' expresion ;
Compiladores I
calc_expresiones: expresion ;
expresion: expresion '+' expresion
(
Estado 0
Estado 1
Estado 2
Estado 3
Estado 4
Estado 5
Estado 6
Estado 7
(
Estado 0
Estado 1
Estado 2
Estado 3
Estado 4
Estado 5
Estado 6
Estado 7
Estado 8
(2 (3 6 6) 1)
%{
#include "declaraciones.h"
extern int yylval;
%}
DIGITO
[0-9]
%%
{DIGITO}+
{ yylval = atoi(yytext);
return tkNATURAL;
}
"("|")"|"*"
{ return yytext[0];
}
{}
{ fprintf(stderr, "Lexical Error: %s\n", yytext );
exit(1);
}
[ \t]+
.
%%
>> declaraciones.h
#ifndef _DECLARACIONES_H
#define tkNATURAL 256
int yylval;
#endif
void analizadorDescendenteRecursivo(ptArbolN a) {
// completar...
}
int esPatron(arbolN a) {
// completar...
}
int main(int argc, char *argv[]){
arbolN miArbol;
if (argc == 2) {
yyin = fopen(argv[1], "r");
elToken = yylex();
analizadorDescendenteRecursivo(&miArbol);
if (esPatron(miArbol)) {
fprintf(stdout, "Es Patron\n");
} else {
fprintf(stdout, "No es Patron\n");
}
liberaArbol(&miArbol);
exit(0);
} else {
fprintf(stderr,"Err.-> %s ficheroTuplas", argv[0]);
exit(1);
}
}