• No se han encontrado resultados

LENGUAJES FORMALES Y AUTÓMATAS II/ITIS 09/09/2011. Apellidos: Nombre:

N/A
N/A
Protected

Academic year: 2022

Share "LENGUAJES FORMALES Y AUTÓMATAS II/ITIS 09/09/2011. Apellidos: Nombre:"

Copied!
10
0
0

Texto completo

(1)

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

(2)

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

1

cuyo 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

2

cuyo 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 GIC

G

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

3

cuyo 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

1

que de cadenas pertenecientes a L

2

, en cualquier orden }

Por ejemplo, bbbccddcdbbbabaabb ∈ L

3

| B S A S

|

λ

(3)

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

n

b

m

c

|n-m|

tal que |n-m| es par, n0, 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:

(4)

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

2

tiene 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

1

es ( c* + b*ab*a )*. Dado que la única

restricción que impone L

2

es 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.

(5)

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)

(6)

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.

(7)

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

;

(8)

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;

(9)

} 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;

} }

(10)

:}

;

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;

} }

Referencias

Documento similar