TEST (3 puntos)
Responda si los siguientes enunciados - precedidos por una letra - son verdaderos o falsos. Utilice para ello una de las tablas que figuran al final. A la hora de rellenar la tabla, coloque una cruz en la fila V si considera que el enunciado de la correspondiente columna es verdadero o, de forma excluyente, coloque una cruz en la fila F cuando considere que es falso. Cada respuesta correcta sumará 0.2. Las respuestas incorrectas restarán 0.2 y las
respuestas en blanco no serán evaluadas.
A. Para todo lenguaje L se cumple que L+ = L* - {λ}
B. Para todo lenguaje L se cumple que L ∩ L* = L C. ( β*β*α*α* )* β = ( α* + α + β )* β + β D. ( (αβ)* β* )* (λ+α) = (α+λ) ( βα + β )*
E. ( αα (β*α*) )* = ( ααα+ααβ )*
F. El lenguaje dado por la gramática S → aSa | bSb | λ puede ser reconocido por un APD(V).
G. El lenguaje dado por la gramática S → aSa | bSb | λ puede ser reconocido por un APD(F).
H. El lenguaje dado por la gramática S → aSa | bSb | c puede ser reconocido por un APD(V).
I. El lenguaje dado por la expresión regular a*b + b*a puede ser reconocido por un autómata de pila indeterminista con aceptación por pila vacía.
J. Para todo λ-AFND M se da que λ∈ L(M).
K. Para todo AFND M1 no existe ningún AFD M2 tal que L(M1) = L(M2).
L. Para todo conjunto de estados Q se cumple que Q ⊆ λ*(Q)
M. Para todo lenguaje regular LR existe al menos una máquina de Turing T que se detiene para cualquier cadena de entrada y que además cumple que L(T) = LR.
N. No todos los lenguajes finitos son lenguajes recursivamente enumerables.
O. El lenguaje dado por la expresión regular ∅ λ ∅ no es un lenguaje dependiente del contexto.
A B C D E F G H I J K L M N O
V X X X X X X X
F X X X X X X X X
A B C D E F G H I J K L M N O V
F
A B C D E F G H I J K L M N O V
F
Ejercicio 1 (1.5 puntos):
a)
(0.3 puntos) Diseñe una GIC G1= ({c, d}, {A}, A, P
1) con dos producciones y un símbolo no terminal para el lenguaje L
1cuyo alfabeto es Σ
1= {c, d} y que viene descrito por el siguiente AP con aceptación por estado final y pila vacía:
A → c A d
| λ
b)
(0.4 puntos) Diseñe una GIC G2= ({a, b}, {B, Y}, B, P
2) con cinco producciones y dos símbolos no terminales para el lenguaje L
2cuyo alfabeto es Σ
2= {a, b} y que viene descrito por el
siguiente λ-AFND:
B → bbbY
Y → aY
| abY
| abbY
| λ
c)
(0.8 puntos) Invocando a las gramáticas anteriores, diseñe una GICG
3= ({a, b, c, d}, {S, A, B, Y}, S, P
3) con tres producciones, sin contar las de los apartados anteriores, para el lenguaje L
3cuyo alfabeto es Σ
3= {a, b, c, d}:
S → A S B S L
3= { cadenas formadas por la misma cantidad, incluida cero, de cadenas pertenecientes a L
1que de cadenas pertenecientes a L
2, en cualquier orden }
Por ejemplo, bbbccddcdbbbabaabb ∈ L
3| B S A S
| λ
Ejercicio 2 (1.5 puntos):
Complete el autómata de pila de la figura para reconocer el siguiente lenguaje por los dos criterios de aceptación. Los alfabetos son
Σ = {a, b, c} y Γ = {a, Z0}.
L = { a
nb
mc
|n-m|tal que |n-m| es par, n ≥ 0, m ≥ 0 }
Consideraremos el cero como número par.
El número total de transiciones debe ser catorce, contando las dos mostradas en la figura, y el número total de estados debe ser seis.
Solución:
Ejercicio 3 (1 punto, SÓLO II):
Considere el lenguaje L
1, dado por el siguiente λ-AFND y de alfabeto
Σ1= {a, b, c} :
El lenguaje L
2tiene alfabeto
Σ2= {a, b} y viene dado por la expresión regular (a+b)*
Se pide una expresión regular, lo más simplificada posible, que describa la intersección de los lenguajes L
1∩ L
2, teniendo en cuenta las siguientes restricciones de diseño:
• No se puede emplear el operador +
• El número de operadores * no puede superar tres.
• El número de operadores de concatenación, es decir · , no puede superar tres.
• Puede emplearse, como máximo, un paréntesis abierto y uno cerrado.
Solución: una expresión regular simplificada para L
1es ( c* + b*ab*a )*. Dado que la única
restricción que impone L
2es que las cadenas estén formadas por letras aes o bes, debemos
eliminar la opción de elegir c* en la anterior expresión regular. El resultado es
( b* a b* a )* , que además cumple las restricciones de diseño.
EJERCICIO LAB (
II: 3 PUNTOS; ITIS: 4 PUNTOS)El fichero de entrada “futbol.txt” contiene una lista histórica de los 3 primeros clasificados de la liga de fútbol por cada temporada.
El listado se inicia con la palabra “@Campeones” y es seguido por una lista que contiene cada una de las temporadas. Cada temporada se inicia con la palabra “%Temporada XXXX/XXXX” y finaliza con “%%%“, donde la palabra XXXX/XXXX indica los años en los que el campeonato tuvo lugar. En cada temporada se almacena únicamente la información de los 3 primeros clasificados indicando con *1*, *2* y *3* el lugar que ocupó en la clasificación. Además, para cada uno de ellos se almacena en un vector la información correspondiente al nombre del Equipo (Equipo), Jornadas disputadas (J), Partidos Ganados (G), Partidos Empatados (E), Partidos Perdidos (P), Goles a Favor (GF), Goles en Contra (GC) y Puntuación (Ptos).
El vector tiene la siguiente forma: [Equipo, J, G, E, P, GF, GC, Ptos].
Un ejemplo del contenido del fichero podría ser el siguiente:
@Campeones
%Temporada 1940/1941
*1* [Atlético de Madrid, 22, 13, 7, 2, 70, 36, 33]
*2* [Athletic Bilbao, 22, 13, 5, 4, 49, 24, 31]
*3* [Valencia CF, 22, 11, 5, 6, 60, 52, 27]
%%%
%Temporada 1941/1942
*1* [Valencia CF, 26, 18, 4, 4, 85, 39, 40]
*2* [Real Madrid, 26, 14, 5, 7, 65, 43, 33]
*3* [Atlético de Madrid, 26, 14, 5, 7, 50, 44, 33]
%%%
%Temporada 1942/1943
*1* [Athletic Bilbao, 26, 16, 4, 6, 73, 38, 36]
*2* [Sevilla FC, 26, 15, 3, 8, 63, 47, 33]
*3* [FC Barcelona, 26, 14, 4, 8, 77, 50, 32]
%%%
%Temporada 1943/1944
*1* [Valencia CF, 26, 18, 4, 4, 73, 32, 40]
*2* [Atlético Aviación, 26, 15, 4, 7, 66, 49, 34]
*3* [Sevilla FC, 26, 12, 8, 6, 60, 46, 32]
%%%
%Temporada 1944/1945
*1* [FC Barcelona, 26, 17, 5, 4, 50, 30, 39]
*2* [Real Madrid, 26, 18, 2, 6, 68, 35, 38]
*3* [Atlético de Madrid, 26, 13, 5, 8, 46, 41, 31]
%%%
%Temporada 1945/1946
*1* [Sevilla CF, 26, 14, 8, 4, 53, 37, 36]
*2* [CF Barcelona, 26, 14, 7, 5, 48, 31, 35]
*3* [Athletic Bilbao, 26, 14, 5, 7, 63, 48, 33]
%%%
@@@
Se pide:
1) El fichero JFlex. (1 punto)
2) El fichero CUP. (1 punto)
3) Una atribución de manera que se imprima por pantalla el nombre del Equipo que ocupando la primera posición posee la mayor Diferencia de Goles (DG) de todos
(DG = GF – GC). (1 punto) En el ejemplo se imprimiría:
Valencia CF, Diferencia de Goles 46, Temporada 1941/1942
4) SOLO ITIS: Una atribución para imprimir el equipo de entre todos los 1º, 2º y 3º de todas las temporadas que tiene la media mayor de goles por número de jornadas disputadas. (1 punto)
En el ejemplo se imprimiría:
Valencia CF, Media de Goles por Jornada 3.26, Temporada 1941/1942
NOTAS:
a) NO se puede utilizar el bloque ‘action code’. Si es necesario definir nuevas clases, hágase en ficheros separados. Ejemplo:
Fichero Equipo.java:
(+ código fuente de la clase Equipo)
b) No es necesario escribir el método syntax_error del Parser.
SOLUCIÓN:
1)
Salto = \n|\r|\r\n Blanco = [ \t\f]
Num = 0|[1-9][0-9]*
Campeones = "@Campeones"
fCampeones = "@@@"
Temporada = "%Temporada"
fTemporada = "%%%"
Sep = "/"
Ac = "["
Cc = "]"
Coma = ","
Pri = "*1*"
Seg = "*2*"
Ter = "*3*"
Cadena = [a-zA-Z áéíóúÁÉÍÓÚÑñÇç]+
%%
{Blanco}+ {;}
{Salto}+ {;}
{Num} {return new Symbol (sym.NUM,new Integer(yytext()));}
{Campeones} {return new Symbol (sym.CAMPEONES,yytext());}
{fCampeones} {return new Symbol (sym.FCAMPEONES,yytext());}
{Temporada} {return new Symbol (sym.TEMPORADA,yytext());}
{fTemporada} {return new Symbol (sym.FTEMPORADA,yytext());}
{Sep} {return new Symbol (sym.SEP,yytext());}
{Ac} {return new Symbol (sym.AC,yytext());}
{Cc} {return new Symbol (sym.CC,yytext());}
{Coma} {return new Symbol (sym.COMA,yytext());}
{Pri} {return new Symbol (sym.PRI,yytext());}
{Seg} {return new Symbol (sym.SEG,yytext());}
{Ter} {return new Symbol (sym.TER,yytext());}
{Cadena} {return new Symbol (sym.CADENA,yytext());}
. {System.out.println("Error léxico: ” + yytext());}
2)
terminal CAMPEONES, FCAMPEONES, SEP, FTEMPORADA, PRI, SEG, TER, AC, CC, COMA, TEMPORADA, NUM, CADENA;
non terminal entrada, campeonesLigas, equipo, equipos, temporada, listaTemporadas;
entrada ::= campeonesLigas ;
campeonesLigas ::= CAMPEONES listaTemporadas FCAMPEONES
;
listaTemporadas ::= temporada listaTemporadas
|
;
temporada ::= TEMPORADA NUM SEP NUM equipos FTEMPORADA
;
equipos ::= PRI equipo SEG equipo TER equipo
;
equipo ::= AC CADENA COMA NUM COMA NUM COMA NUM COMA NUM COMA NUM COMA NUM COMA NUM CC
;
3)
terminal CAMPEONES, FCAMPEONES, SEP, FTEMPORADA, PRI, SEG, TER, AC, CC, COMA, TEMPORADA;
terminal Integer NUM;
terminal String CADENA;
non terminal entrada, campeonesLigas;
non terminal Equipo equipo, equipos, temporada, listaTemporadas;
entrada ::= campeonesLigas ;
campeonesLigas ::= CAMPEONES listaTemporadas:e FCAMPEONES
{: System.out.println(e.getNombre() + ", Diferencia de Goles " + e.getDg() + ", Temporada " + e.getTemporada()); :} ;
listaTemporadas ::= temporada:e1 listaTemporadas:e2 {: if (e1.getDg() > e2.getDg()){
RESULT = e1;
}else{
RESULT = e2;
} :}
| {: RESULT = new Equipo("Ninguno", 0); :}
;
temporada ::= TEMPORADA NUM:anyo1 SEP NUM:anyo2 equipos:e FTEMPORADA {: e.setTemporada(anyo1 + "/" + anyo2);
RESULT = e;
:}
;
equipos ::= PRI equipo:e1 SEG equipo TER equipo {: RESULT = e1; :}
;
equipo ::= AC CADENA:nombre COMA NUM COMA NUM COMA NUM COMA NUM COMA NUM:gf COMA NUM:gc COMA NUM CC
{: RESULT = new Equipo(nombre, gf.intValue()- gc.intValue()); :}
;
public publicpublic
public classclassclassclass Equipo { String nombre;
Integer dg;
String temporada;
public public public
public Equipo(String nombre, Integer dg) { super
supersuper super();
this thisthis
this.nombre = nombre;
this thisthis
this.dg = dg;
} public public public
public Integer getDg() { return
returnreturn return dg;
} public public public
public voidvoidvoid setDg(Integer dg) { void this
thisthis
this.dg = dg;
} public public public
public String getNombre() { return
returnreturn
return nombre;
} public public public
public voidvoidvoid setNombre(String nombre) { void thisthisthis
this.nombre = nombre;
} }
4)
terminal CAMPEONES, FCAMPEONES, SEP, FTEMPORADA, PRI, SEG, TER, AC, CC, COMA, TEMPORADA;
terminal Integer NUM;
terminal String CADENA;
non terminal entrada, campeonesLigas;
non terminal Equipo equipo, equipos, temporada, listaTemporadas;
entrada ::= campeonesLigas ;
campeonesLigas ::= CAMPEONES listaTemporadas:e FCAMPEONES
{: System.out.println(e.getNombre() + ", Media de Goles por Jornada " + e.getGolesXPartido() + ", Temporada " + e.getTemporada()); :}
;
listaTemporadas ::= temporada:e1 listaTemporadas:e2
{: if (e1.getGolesXPartido() > e2.getGolesXPartido()){
RESULT = e1;
} else {
RESULT = e2;
} :}
| {: RESULT = new Equipo("Ninguno",0.0); :}
;
temporada ::= TEMPORADA NUM:anyo1 SEP NUM:anyo2 equipos:e FTEMPORADA {: e.setTemporada(anyo1 + "/" + anyo2);
RESULT = e;
:}
;
equipos ::= PRI equipo:e1 SEG equipo:e2 TER equipo:e3 {:
if (e1.getGolesXPartido() > e2.getGolesXPartido()){
if (e1.getGolesXPartido() > e3.getGolesXPartido()){
RESULT = e1;
} else {
RESULT = e3;
} }else {
if (e2.getGolesXPartido() > e3.getGolesXPartido()){
RESULT = e2;
} else {
RESULT = e3;
} }
:}
;
equipo ::= AC CADENA:nombre COMA NUM:jornadas COMA NUM COMA NUM COMA NUM COMA NUM:gf COMA NUM COMA NUM CC
{: RESULT = new Equipo(nombre, (Double) (gf.doubleValue()/jornadas.doubleValue())); :} ;
public publicpublic
public classclassclassclass Equipo { String nombre;
Double golesXPartido;
String temporada;
public public public
public Equipo(String nombre, Double golesXPartido) { super
super super super();
this this this
this.nombre = nombre;
this this this
this.golesXPartido = golesXPartido;
} public public public
public String getNombre() { return
return return
return nombre;
} public public public
public voidvoidvoidvoid setNombre(String nombre) { thisthis
thisthis.nombre = nombre;
} public public public
public Double getGolesXPartido() { return
return return
return golesXPartido;
} public public public
public voidvoidvoidvoid setGolesXPartido(Double golesXPartido) { this
this this
this.golesXPartido = golesXPartido;
} public public public
public String getTemporada() { return
return return
return temporada;
} public public public
public voidvoidvoidvoid setTemporada(String temporada) { thisthis
thisthis.temporada = temporada;
} }