Recuperatorio del 2do. Parcial

Anuncio
Teoría de Lenguajes // 1er. cuatrimestre de 2001
2do. Parcial
1) Transformar la siguiente gramática a fin de obtener una gramática equivalente que sea LL(1).
Justificar cada transformación realizada. G = <{S,A}, {a, c}, P, S >, con P:
S → Sc | cA | λ
A → aA | a
2) Dada la gramática G: <{S, A, B}, {x, y, (, )}, P, S >, con P:
S → yAy
A → (B) | (x)
B → Ax
a) Describir el lenguaje generado
b) Decidir si es una gramática de precedencia simple. Si lo es, construir la tabla de relaciones
de precedencia. Si no lo es justificar, dar una gramática G' tal que L(G')=L(G) y G’ sea de
precedencia simple, y construir la tabla de relaciones para G’.
c) Decidir si las cadenas:
y(xx)y
y((((x)x)x)x)y
pertenecen a L(G) aplicando el método de reconocimiento de precedencia simple con la tabla
construida en b).
3) Dada la gramática G = <{S,B,C,D}, {b, c, e}, P, S>, con P:
S → Ce | BC | D | BDe
B→b
C→c
D→c
Mostrar que G es LR(1) pero no LALR(1).
4) Dada la gramática G = <{E}, {+, *, var, const}, P, E>, con P:
E→ E + E | E * E | var | const | ( E )
Definir una gramática de atributos que sintetice la expresión original pero reemplazando las
subexpresiones en las que solo aparezcan constantes por su resultado. Por ejemplo:
Si la expresión original es:
a+3*4
(3+2)*4 + a + 2
(3 + a) * 2 + 2 * a
La expresión sintetizada debe ser:
a + 12
20 + a + 2
(3 + a) * 2 + 2 * a
El terminal var tiene un atributo text de tipo string. El terminal const tiene un atributo val de
tipo entero. Se cuenta con la función toString : entero → string que convierte un entero en su
representación decimal
Nota: no tener en cuenta el hecho de que la gramática es ambigua. Asumir que el árbol de
derivación se armará según las precedencias usuales.
Teoría de Lenguajes // 1er. cuatrimestre de 2001
Recuperatorio del 2do. Parcial
1) Dada la siguiente gramática G = < {S, P, M, T, L}, {para, aprobar, desaprobar, de, otras,
materias, teoría, lenguajes}, P, S >, con P:
S→PM
P → para aprobar | para desaprobar
M → T de L | otras materias
T → teoría
L → lenguajes
Determinar si es LL(1). Si no lo es transformarla para que lo sea. Construir la tabla y reconocer
la cadena “para aprobar teoría de lenguajes”.
2) Dada la gramática G: <{S}, {a, b, c}, P, S >, con P:
S → aSSb | c
a) Decidir si es una gramática de precedencia simple. Si lo es, construir la tabla de relaciones de
precedencia. Si no lo es justificar, dar una gramática G' tal que L(G')=L(G) y G’ sea de
precedencia simple, y construir la tabla de relaciones para G’.
b) Decidir si las cadenas:
acaccbb
acb
pertenecen a L(G) aplicando el método de reconocimiento de precedencia simple con la tabla
construida en b).
3) Dada la gramática G = <{S, A}, {a, b, c}, P, S>, con P:
S → Sb | bAa
A → aSc | a | aSb
Determinar cuál es el tipo de parser LR de menor nivel que reconoce el lenguaje generado por
la gramática. Justificar. Construir el autómata correspondiente.
4) Dada la gramática G = <{E}, {+, *, var, const}, P, E>, con P:
E→ E + E | E * E | var | const | ( E )
Definir una gramática de atributos que sintetice la expresión original pero aplicando las
siguientes reglas de simplificación:
Expresión original:
0+E
E+0
1*E
E*1
0*E
E*0
Expresión simplificada:
E
E
E
E
0
0
Los terminales var y const tienen un atributo text de tipo string.
Nota: no tener en cuenta el hecho de que la gramática es ambigua. Asumir que el árbol de
derivación se armará según las precedencias usuales.
Teoría de Lenguajes // 2do. cuatrimestre de 2001
2do. Parcial
Hacer cada ejercicio en hojas separadas. Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
1) Dada la gramática
G1 = < { S, A, L }, { (, ), , , f, x }, P, S >, con P:
S→fA
A→(L)
L→x | x,L | S
a) Decidir si G1 es LL(1). En ese caso armar la tabla LL(1) para ella. En caso contrario dar
G1’ que sí lo sea y genere el mismo lenguaje, y armar la tabla LL(1) para G1’.
b) Reconocer la cadena f(x,f(x)) mediante el método LL(1) con la tabla obtenida en a)
2) Dar la tabla de precedencia simple para la siguiente gramática, señalando todos los conflictos
que tenga.
G2 = < { S, B }, { a, b, c, d }, P, S >, con P:
S→ aS | SB | d
B→ Bb | c
3) La siguiente gramática describe un subconjunto del lenguaje LISP:
G3 = < { E, L }, { (, ), +, int }, P, E >, con P:
E → ( + L ) | int
L→EL|E
a) ¿Es G3 LR(0)?
b) ¿Es G3 SLR?
c) ¿Es G3 LR(1)?
4) Escribir una definición dirigida por sintaxis que acepte cadenas sobre el alfabeto:
{(, ), +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}
cuyo formato sea como el del siguiente ejemplo:
(20,5) + (F,16) – (110,2)
Las cadenas se interpretan de la siguiente manera: cada par ordenado representa un
número natural. El segundo elemento (escrito en base 10) indica la base y el primer elemento es
la representación del número en esa base. En el ejemplo, la cadena debe ser interpretada como
10 + 15 – 6 = 19.
La DDS debe imprimir en pantalla el valor de la expresión. Para eso se puede utilizar el
procedimiento Print( int n ), que imprime en pantalla el entero n. Es decir que para la cadena
del ejemplo se debe ejecutar Print( 19 ).
Además, se deben rechazar las cadenas en las que algún par no represente un número
válido. Por ejemplo, la cadena (124,3) debe ser rechazada porque “4” no puede aparecer en
un número escrito en base 3.
Teoría de Lenguajes // 2do. cuatrimestre de 2001
Recuperatorio del 2do. Parcial
Hacer cada ejercicio en hojas separadas. Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
1) A veces es posible utilizar un parser LL(1) para reconocer una gramática que no lo es. Esto
puede realizarse tomando algunas decisiones en el momento del parseo. Por ejemplo, la
siguiente gramática representa el problema del if-then-else:
G1 = <{S, E, C}, {if, then, sent, else, cond}, P, S>, con P:
S → if C then S E | sent
E → else S | λ
C → cond
a) Mostrar que G1 no es LL(1)
b) Construir la tabla LL(1) para G1.
c) En los lugares donde haya conflicto, modificar la tabla eligiendo una de las entradas de
manera que cada “else” quede asociado con el “if” más cercano. Justificar.
d) Mostrar un parseo top-down y el árbol de derivación resultante para:
if cond then if cond then sent else sent
2) Dada G2 = < {S}, {a, b}, P, S >, con P:
S → aSa | b
a) Decidir si G2 es de precedencia simple. Si lo es, dar su tabla de precedencia simple. Si no,
dar una gramática G2’ que sí lo sea y genere el mismo lenguaje, y construir la tabla de
precedencia simple para G2’.
b) Reconocer la cadena aabaa usando la tabla obtenida en a).
3) Dada G3 = <{A, B}, {a, b, c, d}, P, A> con P:
A → aB | aBc
B → b | dA
a) Construir el conjunto de items LR(1) para G3
b) Para cada una de las siguientes clases, indicar si G3 pertenece a ella: LR(1), LALR, SLR.
4) Sea G4 = <{D, E, T}, {δ, var, :, +, *, ^, const}, P, D>, con P:
D → δ var : E
E→E+T |T
T → const * var ^ const
Se tienen los atributos const.val: Entero, con el valor numérico de la constante, y
var.nombre: Cadena, con el texto identificador de la variable.
Se debe escribir una traducción dirigida por sintaxis que imprima una cadena con la
derivada respecto de la variable que se encuentra luego del δ, del polinomio que aparece a
continuación de los dos puntos. Ejemplo:
Cadena de entrada:
Se debe imprimir:
δx:2*x^3+3*y^2+5*x^5
6 * x ^ 2 + 0 + 25 * x ^ 4
Se dispone de la función str( Entero ): Cadena, que dado un entero devuelve una cadena con
su representación decimal.
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2002
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Dada la gramática G1 = h{S, A}, {a, b}, P, Si, con P :
S → SAa | Aa
A → Aa | b
1. (25 pts)
(a) Describir el lenguaje generado por G1 .
(b) Determinar si G1 es de precedencia simple. En caso afirmativo,
construir la tabla de precedencia. En caso negativo, dar una
gramática de precedencia simple que genere L(G1 ) y construir su
tabla de precedencia.
(c) Reconocer la cadena baaba mediante el método de precedencia
simple utilizando la tabla construida en el punto (b).
2. (25 pts)
(a) Determinar a cuáles de las siguientes clases de gramáticas pertenece G1 : LR(0), SLR, LALR, LR(1).
(b) Reconocer la cadena baaba mediante alguno de los métodos mencionados en el punto (a).
3. (25 pts)
(a) Dar una gramática que sea LL(1) y genere L(G1 ). Construir su
tabla LL(1).
(b) Reconocer la cadena baaba mediante el método LL(1).
4. (25 pts) Dar una gramática de atributos que genere el lenguaje L =
{an (bcn )∗ |n ≥ 2}. Construir un árbol decorado para la cadena aabccbcc.
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2002
Hacer cada ejercicio en hojas separadas. Justificar todas las respuestas.
Poner nombre y número de orden en cada ejercicio.
El examen es a libro abierto. Se aprueba con 65 puntos.
1. (25 pts) Dada la gramática G1 = h{S, T }, {a, b}, P1 , Si, con P1 :
S → b | Sb | T b
T → aT b | ab
(a) Describir el lenguaje generado por G1 .
(b) Determinar si G1 es de precedencia simple. En caso afirmativo,
construir la tabla de precedencia. En caso negativo, dar una
gramática de precedencia simple que genere L(G1 ) y construir su
tabla de precedencia.
(c) Reconocer las cadenas aaabb y aaabbbbb mediante el método de
precedencia simple utilizando la tabla construida en el punto (b).
2. (25 pts)
(a) Dar una gramática que sea LL(1) y genere L(G1 ). Construir su
tabla LL(1).
(b) Reconocer las cadenas del punto 1) c) mediante el método LL(1).
3. (25 pts) Dada la gramática G2 = h{E}, {id, +, (, )}, P2 , Ei, con P2 :
E → id | id(E) | E + id
(a) Determinar a cuáles de las siguientes clases de gramáticas pertenece G2 : LR(0), SLR, LALR, LR(1).
(b) Reconocer las cadenas id(id(id)+id) y id+id(id) mediante alguno
de los métodos mencionados en el punto (a).
4. (25 pts) Dar una gramática de atributos que genere el lenguaje L =
{α|α ∈ (a|b|c)∗ d∗ ∧ |α|a = |α|b = |α|c = |α|d }. Construir un árbol
decorado para las cadenas aabcbcdd y bbccdd.
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2002
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Una lista en el lenguaje PROLOG se puede representar como una secuencia de elementos encerrados entre corchetes y separados por comas. Los
elementos de la lista pueden ser a su vez listas. De esta manera, los siguientes
son ejemplos de listas:
A1 =[a]
A3 =[a, [b, c], d]
A2 =[]
A4 =[[], [a, [a], b, [[]]]]
Llamaremos L al lenguaje sobre el alfabeto Σ = {[; ]; ,; id} formado
por las listas recién descriptas.
1.
(25 pts) Dar una gramática LL(1) para L. Dar su tabla LL(1).
2.
(25 pts) Dar una gramática SLR para L. Dar su tabla SLR.
3.
(25 pts) Dar una gramática de precedencia simple para L. Dar su tabla
de precedencia simple.
4.
(25 pts) Otra manera de representar listas en PROLOG es mediante
su forma canónica, que es [ cabeza | cola ] para listas no vacı́as, y []
para la lista vacı́a:
Lista
[]
[a]
[a, b]
[[a, b], c]
Forma canónica
[]
[a|[]]
[a|[b|[]]]
[[a|[b|[]]]|[c|[]]]
Escribir una gramática de atributos que tome una lista perteneciente al
lenguaje L y sintetice en un atributo de tipo String su forma canónica.
El token id tiene un atributo nombre de tipo String.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2002
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Una fórmula quı́mica es una manera concisa de expresar información sobre los átomos que constituyen un compuesto. Cada elemento es identificado
por su sı́mbolo quı́mico y la cantidad de átomos de cada elemento es indicada
por un subı́ndice, si es mayor que uno. Por ejemplo, el metano, una molécula
simple compuesta por un atomo de carbono unido a cuatro de hidrógeno,
tiene la fórmula quı́mica CH4 . Si un ion se repite más de una vez, esto se
puede expresar encerrándolo entre paréntesis y agregando un subı́ndice indicando la cantidad de veces que se repite. Por ejemplo, el sulfato férrico
está compuesto por dos átomos de hierro y tres iones sulfato, cada uno de los
cuales se compone de un átomo de azufre y cuatro de oxı́geno: Fe2 (SO4 )3 .
De esta manera, los siguientes son ejemplos de fórmulas quı́micas:
Oxı́geno: O2
Ferrocianuro Férrico: Fe2 (Fe(CN)3 )3
Agua: H2 O
Llamaremos L al lenguaje sobre el alfabeto Σ = {(, ), elem, num}
formado por las fórmulas quı́micas recién descriptas.
1.
(25 pts) Dar una gramática SLR para L. Dar su tabla SLR.
2.
(25 pts) Dar una gramática de precedencia simple para L. Dar su tabla
de precedencia simple.
3.
(25 pts) Dar una gramática LL(1) para L. Dar su tabla LL(1).
4.
(25 pts) Cada elemento tiene un peso atómico caracterı́stico. El peso
molecular de un compuesto es la suma de los pesos atómicos de los
átomos que lo componen. Por ejemplo, el peso atómico del hidrógeno
es 1,00797 y el del oxı́geno es 15,9994, por lo que el peso molecular del
agua es 18,01534.
Escribir una traducción dirigida por sintaxis que acepte una fórmula
del lenguaje L e imprima el peso molecular del compuesto descripto
por la misma. El token elem tiene un atributo pesoAt de tipo Real y
el token num tiene un atributo valor de tipo Entero.
1
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2003
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Consideraremos una forma simplificada para la sintaxis de expresiones
del lenguaje Smalltalk. Las subexpresiones “basicas” son los identificadores
(terminal id) y literales de enteros (terminal int). Hay tres tipos de subexpresiones compuestas:
• Expresiones unarias: un operador unario es un identificador (id) y se
escribe después de la subexpresión a la cual se aplica. Por ejemplo,
x sqrt representa la raı́z cuadrada de x.
• Expresiones binarias: hay un gran número de operadores binarios, que
representaremos mediante el sı́mbolo terminal binOp. Se escriben en
forma infija, y se evalúan estrictamente de izquierda a derecha (es
decir que no hay precedencia entre ellos). Entonces, x+y*z significa lo
mismo que (x+y)*z
• Expresiones con palabras clave: tienen la forma e0 k1 e1 . . . kn en , es decir, una subexpresión e0 y luego palabras clave ki alternando con
subexpresiones ei . Cada palabra clave ki se asocia con su expresión
correspondiente ei . Las palabras clave son reconocidas por el analizador léxico y se representan por el terminal key. En la cadena de entrada, se ven como un identificador seguido por dos puntos. Un ejemplo
de expresión con palabras clave es: a at: 3 put: (x+y)
Precedencia: a menos que se usen paréntesis, primero se aplican siempre los
operadores unarios, después los binarios, y después se evalúan las expresiones
con palabras clave. Entonces, la expresión α:
a at: x+5 put: (b+c / d sqrt) truncate
tiene el mismo significado que la expresión α0 :
a at: (x+5) put: (((b+c) / (d sqrt)) truncate)
Llamaremos L al lenguaje sobre el alfabeto Σ = {id, int, binOp, key, (, )}
formado por las expresiones recién descriptas.
1
1. (30 pts) Dar una gramática no ambigua G para L que respete las reglas
de precedencia y asociatividad descriptas. Dar el árbol de derivación
producido por la gramática para la expresión α.
2. (30 pts) Decidir si G es SLR. En caso contrario modificarla para que
lo sea.
3. (30 pts) Dar una gramática de atributos que dada una expresión del
lenguaje L sintetice en un atributo una expresión equivalente pero sin
paréntesis innecesarios. Por ejemplo, si la cadena de entrada es α0 , la
cadena sintetizada debe ser α. Todos los terminales tienen un atributo
text asignado por el analizador léxico.
4. (10 pts) ¿Piensa que se podrı́a dar una gramática LL(1) para L? De
ser posible, ¿serı́a conveniente usarla para resolver el ejercicio 3?
2
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2003
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La gramática G representa un lenguaje para especificar textos con subı́ndices y superı́ndices similar al utilizado en el sistema LATEX:
G = h{S, E, F }, {c, _, ^, {, }}, S, P i, con P :
S −→ S E | E
E −→ F
F ^ F |F ^ F
F |F
F |F ^ F |F
F −→ c | { S }
El terminal c representa una letra cualquiera. El sı́mbolo _ significa
subı́ndice, ^ significa superı́ndice y las llaves sirven para agrupar. Los siguientes son algunos ejemplos de expresiones y sus significados:
Expresión
a_b^c
a_ba^c
a_{bc}
ak^{bc_d}_{e^g_h}no^p
Significado
acb
ab ac
abc
akebcgd nop
h
Para una implementación simplificada, consideramos que cada letra aparecerá incluida en una “caja” de tamaño t cuyo vértice inferior izquierdo
tiene coordenadas (x, y) (como se trata de una simplificación, supondremos
que la caja que contiene una letra es cuadrada y que todas las letras son
del mismo tamaño). Para que una letra aparezca como subı́ndice de otra
se debe reducir su tamaño un 70 % y desplazar su coordenada y de manera
que su caja quede centrada con respecto a la lı́nea de base original. Para
que aparezca como superı́ndice se debe hacer lo mismo pero dejando la caja
centrada con respecto a la lı́nea superior. La primer letra tendrá t = 1 y
(x, y) = (0, 0). El siguiente gráfico muestra algunas de las coordenadas y
tamaños que resultan de la cadena a^{b^e}_{cd}an^{d_e}
1
0.49
0.7
1
(0, 0)
a
b
e
c d
(1, -0.35)
a n
d
e
(1.7,
-0.35)
1. (25 puntos) Decidir si G es SLR. En caso contrario dar una gramática
SLR que genere L(G) y dar su tabla SLR. Intentar reconocer la cadena
a^b_b^c.
2. (20 puntos) Decidir si G es LL(1). En caso contrario dar una gramática
LL(1) que genere L(G) y dar su tabla LL(1). Reconocer la cadena
a^b_{b^c}.
3. (25 puntos) Dar la tabla de precedencia simple para G. Indicar qué modificaciones se deben hacer a la gramática para solucionar el conflicto.
4. (30 puntos) Dar una gramática de atributos que acepte cadenas de L
y asigne a cada terminal c los atributos x, y, y t describiendo la caja
donde se debe ubicar la letra.
2
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2003
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G:
E −→ id | (E) | op L
L −→ E | L E
(a) (5 pts) Mostrar que G ambigua.
(b) (25 pts) Dar la tabla SLR para G. Resolver los conflictos en la
tabla de manera que un operador actúe siempre sobre todos los
operandos que tiene a su derecha. Es decir que op op id op id id
se debe interpretar como op (op id (op id id))
(c) (15 pts) Dar la tabla de precedencia simple para G.
(d) (25 pts) Eliminar la recursión a izquierda de G. Dar la tabla LL(1)
de la gramática resultante. Resolver los conflictos en la tabla de
manera que el lenguaje aceptado por el parser sea L(G).
2. (30 pts) Dar una gramática de atributos que acepte cadenas del lenguaje:
{ak bω | k ≥ 0 ∧ ω ∈ (a|b)∗ ∧ la(s) subcadena(s) más larga(s) de aes
consecutivas de ω tiene(n) longitud exactamente k}
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2003
Hacer cada ejercicio en hojas separadas. Poner nombre y número de orden en
cada ejercicio. Justificar todas las respuestas. El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G =< {id, +, (, )}, {S, A}, S, P >, en donde:
P = {S −→ S + A | A
A −→ ( S ) | id( S ) | id}
(a) (25 pts) Decidir si G es SLR. En caso contrario dar una gramática
SLR que genere L(G) y dar su tabla SLR.
(b) (25 pts) Decidir si G es LL(1). En caso contrario dar una gramática LL(1) que genere L(G) y dar su tabla LL(1).
(c) (20 pts) Dar la tabla de precedencia simple para G. Explicar por
qué se produce el conflicto. Dar una gramática de precedencia
simple que genere L(G).
2. (30 pts) El siguiente fragmento de gramática describe parte de la sintaxis de un lenguaje imperativo.
P rograma −→ procedure ListaSent
ListaSent −→ Sent ListaSent
|
ListaSent
Sent −→ do var = const to const begin ListaSent end
|
if var then ListaSent else ListaSent endif
|
Asignacion
Se quiere estimar en tiempo de compilación la cantidad de veces que
se ejecuta cada sentencia y el tiempo total de ejecución del programa.
Para eso se asume lo siguiente:
• Una asignación se ejecuta en una unidad de tiempo.
• Una sentencia de la forma do i = D to H se ejecuta H − D + 1
veces, donde D y H son constantes que se conocen en tiempo de
compilación.
• En una sentencia if, se asume que la mitad de las veces se ejecuta
la parte del then, y la otra mitad la parte del else.
Agregar a la gramática reglas semánticas que asignen a P rograma,
ListaSent, Sent y Asignacion atributos que indiquen la cantidad de
veces que se ejecutan y la cantidad de asignaciones que se realizan por
cada vez que se ejecutan. El terminal const tiene un atributo val de
tipo entero que indica su valor.
1
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2004
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G1 =< {a, b, c, d}, {X, Y, Z}, P1 , X >, con P1 :
X −→ Y aY b | ZbZa
Y −→ cY | λ
Z −→ d | λ
(a) (20 pts) Decidir si G1 es LL(1). En caso contrario, dar una gramática
LL(1) que genere L(G1 ).
(b) (30 pts) Decidir si G1 es de precedencia simple. En caso contrario,
dar una gramática de precedencia simple que genere L(G1 ).
(c) (30 pts) Mostrar que G1 no es SLR pero es LALR.
2. (20 pts) Dada la gramática G2 =< {Σ, Π, n, (, )}, {E, O, A}, P2 , E >,
con P2 :
E −→ O(A)
O −→ Σ | Π
A −→ A, n | n
en donde el sı́mbolo terminal n representa un número entero y tiene un
atributo val que indica su valor, se pide agregarle atributos y reglas
semánticas para convertirla en una traducción dirigida por sintaxis
que imprima el resultado de la expresión (la suma o el producto de los
argumentos según corresponda).
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2004
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Dada la gramática G =< {(, )}, {S}, P, S >, con P :
S −→ SS | (S) | ()
1. (25 pts) Decidir si G es LL(1). En caso contrario, dar una gramática
LL(1) que genere L(G).
2. (25 pts) Decidir si G es de precedencia simple. En caso contrario, dar
una gramática de precedencia simple que genere L(G).
3. (25 pts) Decidir si G es SLR. En caso contrario, dar una gramática
SLR que genere L(G).
4. (25 pts) Convertir a G en una gramática de atributos que no permita
un nivel de anidación de paréntesis mayor a un K fijo.
1
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2004
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G1 =< {a, b, c}, {A, B, C}, P1 , A >, con P1 :
A −→ B C
B −→ a b B | λ
C −→ a c C | λ
(a) (35 pts) Mostrar que G1 no es LR(1). Dar una gramática SLR
que genere L(G1 ). Dar su tabla SLR.
(b) (35 pts) Mostrar que G1 no es LL(1). Dar una gramática LL(1)
que genere L(G1 ). Dar su tabla LL(1)
2. (30 pts) La siguiente gramática representa un fragmento de un lenguaje similar a C:
f unc −→ tipo id { stats }
stats −→ stats stat | λ
stat −→ asig | return | return exp
| if( exp ) stat else stat | { stats }
tipo −→ void | int
(Considerar a exp y asig como terminales) Se pide convertirla en una
gramática de atributos que sólo acepte programas que cumplan con
las siguientes reglas:
• Si el tipo de la función es int, entonces los returns tienen que
estar acompañados por una expresión, y debe haber al menos un
return en todo camino de ejecución.
• Si el tipo de la función es void, entonces puede no haber ningun
return, y los que haya no tienen que estar acompañados por una
expresión.
• No tiene que haber código inalcanzable. (Asumir que las condiciones de los if no son tautologı́as ni contradicciones).
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2004
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G1 =< {a, b, c}, {A, B, C}, P1 , A >, con P1 :
S −→ id | V = E
V −→ id | id [ E ]
E −→ V
(a) (35 pts) Construir la tabla SLR para G1 . ¿Se puede resolver el
conflicto eligiendo una de las entradas de la tabla de manera que
el lenguaje aceptado sea L(G1 )? ¿Se resolverı́a el conflicto si se
usara el método LALR? (No hace falta construir toda la tabla
LALR para contestar esto último)
(b) (35 pts) Mostrar que G1 no es LL(1). Dar una gramática LL(1)
que genere L(G1 ). Dar su tabla LL(1)
2. (30 pts) La siguiente gramática genera sumas de identificadores con a
lo sumo un nivel de anidación de paréntesis:
L −→ L + O | O
O −→ ( E ) | id
E −→ E + id | id
Se pide convertirla en una gramática de atributos que sólo acepte cadenas que tengan más identificadores encerrados entre paréntesis que
libres. Por ejemplo:
Cadenas no aceptadas
id + id
id + id + (id)
id + (id)
Cadenas aceptadas
id + (id + id)
(id + id) + id + id + id + (id + id)
(id + id + id) + id + (id + id)
1
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2005
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática representa un fragmento de las expresiones válidas
en el lenguaje de programacion C:
G1 =< {id, ?, :, +}, {E}, P1 , E >, con P1 :
E −→ E ? E : E
E −→ E + E
E −→ id
1. (40 pts)
(a) Dar la tabla SLR para G1 , señalando todos los conflictos que
tenga.
(b) El operador ternario condicional ? : es asociativo a derecha, y
tiene menor precedencia que el operador +, que es asociativo a
izquierda. Con esta información, resolver los conflictos en la tabla
obtenida en el punto anterior, eligiendo en cada caso una de las
entradas de manera que se respeten las precedencias y asociatividades descriptas y se reconozca el lenguaje L(G1 ). No se debe
modificar la gramática, sólo las entradas de la tabla que tengan
conflictos.
(c) Utilizar la tabla con los conflictos resueltos para reconocer las
cadenas α1 = id ? id : id + id ? id : id, y α2 = id ? id
? id + id : id : id. Dar los árboles de derivación obtenidos.
2. (30 pts) Dar una gramática LL(1) que genere L(G1 ). Dar su tabla
LL(1).
3. (30 pts) La siguiente gramática describe un fragmento de un lenguaje
similar a C:
SwStmt −→ switch ( expr ) Stmt
Stmt −→ expr | SwStmt | id : Stmt | default : Stmt | { SList }
SList −→ λ | Stmt SList
Se pide convertirla en una gramática de atributos que sólo acepte fragmentos de programa en los que cada sentencia switch tenga a lo sumo
una cláusula default.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2005
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. Dada la gramática G1 =< {a, b, c, d, e}, {T, B, C}, P1 , T >, con P1 :
T −→ a T e | B b
B −→ e B a | C c | λ
C −→ d C c | λ
(a) (35 pts) Construir la tabla SLR para G1 . ¿Se pueden resolver los
conflictos eligiendo en cada caso una de las entradas de la tabla
de manera que el lenguaje aceptado sea L(G1 )? ¿Se resolverı́a el
conflicto si se usara el método LALR? (No hace falta construir
toda la tabla LALR para contestar esto último)
(b) (35 pts) Decidir si G1 es LL(1). De serlo, dar su tabla LL(1). En
caso contrario, dar una gramática LL(1) que genere L(G1 ) y dar
su tabla LL(1).
2. (30 pts) Dar una gramática de atributos que acepte cadenas del lenguaje:
{ak bω | k ≥ 1 ∧ ω ∈ (a|b)∗ ∧ ninguna subcadena maximal de aes
consecutivas de ω tiene longitud exactamente k}
Ejemplos: aaabbbaaaabaa pertenece al lenguaje. aababaabaaabbaaaa
no pertenece al lenguaje.
1
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2005
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (10 pts) Sea G1 =< {a, b, c}, {A, B, C}, P1 , A >, con P1 :
A −→ B C
B −→ a B b | B b | λ
C −→ b C c | b C | λ
Definir por comprensión L(G1 ). Mostrar que G1 es ambigua.
2. (40 pts) Intentando obtener una gramática SLR para L(G1 ) alguien
escribió la gramática G2 :
A −→ B C
B −→ a B b | λ
C −→ b C c | b C | λ
(a) Decidir si L(G2 ) = L(G1 ).
(b) Decidir si G2 es SLR. En caso contrario indicar si se pueden solucionar los conflictos que haya seleccionando una de las entradas
de la tabla.
(c) Decidir si G2 es ambigua. En caso afirmativo dar una gramática
no ambigua para L(G2 )
3. (25 pts) La misma persona quiso luego obtener una gramática LL(1)
para L(G1 ), y escribió G3 :
A −→ B C
B −→ a B b | λ
C −→ b C D | λ
D −→ c | λ
(a) Decidir si L(G3 ) = L(G1 )
(b) Decidir si G3 es LL(1). En caso contrario indicar si se pueden
solucionar los conflictos que haya eligiendo una de las entradas
de la tabla.
4. (25 pts) Agregar atributos y condiciones a G1 , sin modificar la gramática, de manera que para cada cadena en L(G1 ) haya únicamente un
árbol de derivación aceptado.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2005
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática G representa un
Java:
E −→ E =
E −→ E +
E −→ id
E −→ ( E
fragmento de las expresiones en
E
E
)
La asignación es asociativa a derecha, y tiene menor precedencia que el
operador +. El operador + es asociativo a izquierda. De esta manera, la
cadena:
a = b + c + d = e
es equivalente a:
a = (((b + c) + d) = e)
1. (35 pts) Dar la tabla SLR para G. Resolver los conflictos de la tabla
sin modificar la gramática de manera que los árboles de derivación
resultantes respeten las precedencias y asociatividades descriptas.
2. (35 pts) Dar una gramática LL(1) para L(G). Dar su tabla LL(1).
3. (30 pts) El operador + puede significar suma de valores numéricos o
concatenación de cadenas, dependiendo cuáles sean sus operandos. Si
ambos operandos son numéricos, se suman sus valores. Si ambos son
cadenas, se concatenan. Si uno es cadena y el otro numérico, éste último se convierte a cadena y se concatenan ambas.
Por otra parte, en la asignación el término de la izquierda debe ser
algo a lo que se le pueda asignar un valor (en este fragmento de Java, esto es únicamente un nombre de variable, que puede estar entre
paréntesis). Y el tipo del término de la derecha debe ser compatible
con el tipo del de la izquierda (int no es compatible con String, ni
viceversa).
Suponiendo que el terminal id tiene un atributo tipo, que puede tomar los valores int o String, y un atributo nombre de tipo string, que
tiene el nombre del identificador, construir una gramática de atributos
agregando atributos y condiciones a G, sin modificar la gramática, de
manera que se pueda saber el tipo de cada subexpresión, y sólo acepte
1
cadenas en las que se cumplan las condiciones expresadas en el párrafo
anterior.
Por ejemplo, si a y b son de tipo String, y c y d son de tipo int, las
siguientes cadenas son válidas:
( a ) = ( ( ( c ) ) = d ) + d + a
c + ( d = c = ( d + c ) + d )
y las siguientes son inválidas:
a = d +
a + ( c
d + c =
(d = c)
c
= b )
c + d
= c + d
(Asignación
(Asignación
(Asignación
(Asignación
de int a String)
de String a int)
a algo que no es un identificador)
a algo que no es un identificador)
No tener en cuenta el hecho de que la gramática G es ambigua. Asumir
que el árbol de derivación se construirá de acuerdo a las precedencias
y asocitividades descriptas.
2
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2006
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática G representa un subconjunto del lenguaje de especificación de gramáticas utilizado por YACC y otras herramientas derivadas
de él. En este lenguaje, una gramática está compuesta por una serie de reglas (Rs ), donde cada regla (R) se compone de un identificador (la parte
izquierda de la producción) seguido por ‘:’, la parte derecha (P D), reglas
optativas (Ropt ), y puede opcionalmente estar terminada con ‘;’ (Popt ).
G =< {id, ’:’, ’|’, ’;’}, {Rs , R, Ropt , P D, Popt }, P, Rs >, con P :
Rs −→ R
|
Rs R
R −→ id ’:’ P D Ropt Popt
Ropt −→ λ
|
’|’ P D Ropt
P D −→ λ
|
P D id
Popt −→ λ
|
’;’
1. (35 pts) Dar la tabla SLR para G, señalando todos los conflictos que
tenga. Decidir si se pueden solucionar los conflictos eligiendo en cada
caso una de las entradas de la tabla sin modificar la gramática. Explicar
qué caracterı́stica del lenguaje es la que provoca los conflictos.
2. (30 pts) Escribir una gramática extendida que genere L(G) y que no
utilice recursión. Decidir si la gramática propuesta es ELL(1).
3. (5 pts) Decidir si G es de precedencia simple.
4. (30 pts) Convertir a G en una gramática de atributos de manera que
no se acepten especificaciones de gramáticas en las que haya recursión
a izquierda inmediata. El token id tiene un atributo nombre de tipo
String.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2006
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática G representa un subconjunto de las expresiones de
tipos del lenguaje Haskell. En este subconjunto podemos tener nombres de
tipo (identificadores que empiezan con mayúscula), variables de tipo (identificadores que empiezan con minúscula), el tipo nulo, funciones, listas y
tuplas de tipos.
G =< {Nom, Var, ’(’, ’)’, ’[’, ’]’, ’,’, ’->’}, {T, LT }, P, T >, con P :
T
LT
−→
|
|
|
|
|
Nom
var
’(’ ’)’
’(’ LT ’)’
’[’ T ’]’
T ’->’ T
Nombre de tipo
Variable de tipo
Tipo nulo
Tupla
Lista
Función
−→ T
|
LT ’,’ LT
1. (25 pts)
(a) Mostrar que G es ambigua.
(b) Dar una gramática G1 que genere L(G) y sea SLR, teniendo en
cuenta que la expresión
var -> var -> [ Nom ]
se debe interpretar como:
var -> (var -> [ Nom ])
Dar la tabla SLR de la gramática propuesta.
2. (25 pts) Dar una gramática extendida que genere L(G) y sea ELL(1).
3. (25 pts) Dar la tabla de precedencia simple de G1 .
4. (25 pts) Convertir G1 en una gramática de atributos de manera que
sólo se acepten expresiones en las que ninguna variable de tipo aparezca
en la parte izquierda de una función.
1
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2006
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática G describe la sintaxis de un lenguaje de programación
(bastante limitado). En este lenguaje hay una única variable x. Un programa
en este lenguaje es una serie de asignaciones a esa variable. El terminal num
representa una constante entera.
G =< {x, num, ;, =, +, (, )}, {S, E}, P, S >, con P :
S −→ x = E
|
S;S
E −→
|
|
|
num
x
E+E
(E)
1. (25 pts)
(a) Dar la tabla SLR para G, señalando todos los conflictos que tenga.
(b) ¿Se pueden resolver los conflictos seleccionando en cada caso una
de las entradas de la tabla de manera que el lenguaje reconocido
sea L(G)? En caso afirmativo, ¿es única la solución?
(c) ¿Se resolverı́an los conflictos si se usara LALR?
2. (25 pts) Dar una gramática extendida para L(G) que sea ELL(1).
3. (25 pts)
(a) Dar la tabla de precedencia simple para G, señalando todos los
conflictos que tenga.
(b) ¿Se pueden resolver los conflictos seleccionando en cada caso una
de las entradas de la tabla de manera que el lenguaje reconocido
sea L(G)? En caso afirmativo, ¿es única la solución?
4. (25 pts) Convertir G en una gramática de atributos que sintetice el
valor final asignado a la variable x. El terminal num tiene un atributo
val de tipo entero. Al comienzo de la ejecución de un programa en
este lenguaje, la variable x no está inicializada. Se deben rechazar los
programas en los que el resultado sea indefinido.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2006
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Consideramos una sintaxis simplificada para expresionenes del lenguaje Common LISP: una expresión puede ser un átomo o una lista. Los átomos pueden
ser sı́mbolos, números, o cadenas (terminales sym, num y str, respectivamente). Una lista es una secuencia de expresiones encerradas entre paréntesis:
( y ). Las listas pueden ser vacı́as. Ejemplos de expresiones válidas pueden
ser entonces:
num
()
( sym () num str )
( ( num ) sym ( sym num str () ) )
1. (25 pts) Dar una gramática SLR para el fragmento de Common LISP
descripto. Dar su tabla SLR. Decir si la gramática propuesta es LR(0).
2. (25 pts) Dar una gramática extendida ELL(1) para el fragmento de
Common LISP descripto.
3. (25 pts) Dar una gramática de precedencia simple para el fragmento
de Common LISP descripto. Dar su tabla de precedencia simple.
4. (25 pts) Agregar atributos a la gramática propuesta en el ejercicio
1 o en el 3 de manera que sólo se acepten expresiones en las que el
primer elemento de toda lista no vacı́a sea un sı́mbolo o una lista vacı́a.
(Por ejemplo, de las expresiones que se enumeran más arriba se deben
aceptar todas excepto la última).
1
Teorı́a de Lenguajes – Segundo parcial
Primer cuatrimestre 2007
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (25 pts) Dé una gramática LL(1) para el siguiente lenguaje y construya la
tabla correspondiente.
{(a|λ)bn (cd)n /n ≥ 0}
2. (25 pts) Dar la tabla de precedencia simple para la siguiente gramática y
decidir si es de precedencia simple. Si no lo es modificar la gramática para
que lo sea.
E
B
D
→
→
→
eB | B
BaD | d
d
3. (25 pts) Dar la tabla SLR para la siguiente gramática. Si tiene conflictos
decidir si pueden solucionarse en la tabla. Justificar.
S
B
A
→
→
→
B | aB | a
A | bA
S |b
4. (25 pts) Considere el lenguaje de las expresiones booleanas con conjunción
y disyunción, y los valores v, f y bottom. Las tablas de verdad serı́an las
usuales salvo que el resultado de cualquier operación con bottom es bottom.
Agregamos al lenguaje dos funciones, e() y n(), para especificar si la evaluación de la expresión que contienen es estricta o no estricta. Las expresiones se evalúan de izquierda a derecha, y si el tipo de evaluación es no
estricto no debe evaluarse la expresión completa cuando sea posible (por
1
ejemplo n(v ∨ bottom) evalúa a verdadero en vez de bottom, mientras que
n(f ∧ bottom) evalúa a falso).
No hay un tipo de evaluación por defecto, por lo que es obligatorio especificar el tipo de evaluación de la expresión completa.
Dar una gramática de atributos para este lenguaje que sintetice el valor de
la expresión en un atributo, rechazando las cadenas que evalúan a bottom.
La cadena n((v ∧ v) ∨ e(v ∧ bottom)) es aceptada y devuelve verdadero.
La cadena e((v ∧ v) ∨ e(v ∧ bottom)) es rechazada.
2
Teorı́a de Lenguajes – Segundo Recuperatorio
Primer cuatrimestre 2007
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (30 pts) Dada G1 =< {S, A, D, B, C}, {a, b, c}, S, P >, con P :
S
A
D
B
C
→
→
→
→
→
ABC
bD
aD | λ
b|λ
Dc
Determine si G1 es LL(1). En caso de no serlo, dé una gramática LL(1) para L(G1 ) y
construya la tabla correspondiente.
2. (20 pts) Dar la tabla de precedencia simple para la siguiente gramática, señalando todos los
conflictos que tenga. G2 =< {S, C}, {a, x, y, z}, P, S >, con P :
S
C
→ xS | SC | a | C
→ Cyx | z
3. (30 pts) Dada G3 =< {S, B, A, C}, {a, d}, S, P > con P :
S
B
A
C
→
→
→
→
BAC
Ba | λ
a|λ
aCd | λ
Determine si G3 es SLR. En caso de no serlo, ¿se podrı́an solucionar los conflictos modificando la tabla? Justifique.
4. (20 pts) La gramática G4 =< {A}, {n, (, ), ∅}, S, P >, con P :
A →
∅ | n | n(A A)
genera árboles binarios. Suponiendo que el token n tiene asociado un valor entero (val),
convertirla en una gramática de atributos que:
Sólo acepte árboles ordenados (en orden creciente no estricto).
Devuelva en un atributo del sı́mbolo distinguido una cadena de caracteres con los elementos del árbol ordenados, separados por comas.
1
Teorı́a de Lenguajes – Segundo recuperatorio
Segundo cuatrimestre 2007
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (25 pts) Dada la siguiente gramática G1 = h{S, A, B}, {a, b, c}, P1 , Si,
con P1 :
S → Ab | Ba | c
A → Aa | b
B → Bb | Sa | a
¿Es LL(1)? Si no lo es, dar una gramática G2 , tal que L(G2 ) = L(G).
2. (25 pts) Dada la siguiente gramática G3 = h{S, ID, N U M, ST R, HEAD},
{char, digit,0 }, P2 , Si, con P2 :
S
ID
NUM
ST R
HEAD
→
→
→
→
→
ID | ST R | N U M
char | ID char | ID digit
digit | N U M digit
HEAD 0
0 | HEAD char | HEAD 0
0
Decidir si G3 es de precedencia simple. En cualquier caso, dar la tabla
completa.
3. (25 pts) Dada la siguiente gramática G4 = h{S, A, B}, {a, b, c}, P3 , Si,
con P1 :
S → a | AbB
A → a
B → A|c
Decidir si G4 es SLR. Si no lo es, ¿se pueden solucionar los conflictos
eligiendo entradas en la tabla?
1
4. (25 pts) Dada la siguiente gramática que declara clases con herencia
G5 = h{P ROGRAM, DECL − LIST, DECL, IN HERIT AN CE},
{class, id, inherits, “, ”, “; ”}, P4 , P ROGRAM i, con P1 :
P ROGRAM
DECL − LIST
DECL
IN HERIT AN CE
→
→
→
→
DECL − LIST
DECL, DECL − LIST | DECL
class id IN HERIT AN CE;
inherits id | λ
Dar un Gramática de Atributos que verifique:
No se pueden declarar dos clases con el mismo nombre.
Si la clase B hereda de la clase A, la declaración de A debe
aparecer antes en el programa.
Nota: Suponer que el token id tiene un atributo nombre del tipo String.
Se puede usar atributos del tipo Lista si es necesario.
2
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2008
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
El lenguaje de programación Python cuenta con una abstracción funcional que se llama Diccionario. Un diccionario asocia valores con claves.
Los valores pueden ser cualquier cosa, pero las claves deben ser elementos
de tipos “razonables”. Por ejemplo, no pueden ser listas, porque las listas
pueden cambiar, y eso romperı́a un poco la onda del diccionario. Sı́ pueden
ser tuplas y, como utilizaremos en este examen, números enteros. Nos limitaremos a números enteros y diccionarios de la misma pinta (i.e. definición
recursiva) para los valores.
Los diccionarios se representan como en los siguientes ejemplos
{}
{4: 5,6:1000}
{7:80,4: {1:4,5:10},6:12,}
Los docentes le pagamos a una consultora en gramáticas para que nos
diera una para los diccionarios que estamos intentando describir. Obtuvimos
esto.
G1 = h{D, LP , LPSC , P }, {num, {, }, :, ”, ”}, P1 , Di, con P1 :
D −→ {LP }
LP −→ LPSC , | LPSC | λ
LPSC −→ LPSC , LPSC | P
P −→ num : num | num : D
1. (10 pts) G1 describe correctamente el lenguaje que mencionamos. ¿Es
LALR?
2. (30 pts) Dar una gramática para L(G1 ) que sea SLR.
3. (30 pts) Dar una gramática LL(1) para L(G1 ) y reconocer la cadena
{2 : 15, 3 : {2 : 3, 4 : 10, }} con un parser no recursivo (el de la
tablita...).
4. (30 pts) Agregar atributos y condiciones a G1 , para que solamente
acepte diccionarios tales que todos sus subdiccionarios (valores que
sean diccionarios) tengan sus claves ordenadas en forma creciente. num
tiene un atributo de nombre valor de tipo entero.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2008
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Algunas calculadoras a transistores utilizan la notación polaca inversa para las expresiones aritméticas. Esta notación fue inventada por el
matemático polaco Jan Lukasiewicz, y tiene la particularidad de no requerir
paréntesis. Por ejemplo, las expresiones
2 + 5 * 3
(2 + 5) * 3
se pueden expresar en notación polaca inversa como
2 5 3 * +
2 5 + 3 *
Los docentes le pagamos a una consultora en gramáticas para que nos
diera una para un subconjunto de las expresiones en notación polaca inversa.
Obtuvimos esto.
G1 = h{E}, {num, c}, P1 , Ei, con P1 :
E −→ num|EE + |EE ∗ |E c
1. (30 pts) G1 describe correctamente el lenguaje que mencionamos. ¿Es
LALR?
2. (30 pts) Dar una gramática LL(1) para L(G1 ) y reconocer la cadena
2 5 + 3 * con un parser no recursivo (el de la tablita...).
3. (40 pts) Agregar atributos y condiciones a G1 para obtener el valor
de una expresión. c indica elevar al cuadrado. num tiene un atributo
de nombre valor de tipo entero. Además, solamente se deben aceptar
las expresiones que no tengan más de dos números consecutivos. Por
ejemplo, 2 5 + 3 + da el mismo resultado que hacer 2 5 3 + +, pero
solo la primera opción debe ser aceptada.
1
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2008
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Un trie, o radix tree, es una estructura de datos útil para, por ejemplo, almacenar cadenas de unos y ceros.
Para este parcial, los docentes quisimos convidarlos con una forma de representar un trie. Una consultora en
gramáticas nos vendió el siguiente producto:
0
S −→ ( T ) ( T )
G1 = h{S, T, B}, {verdadero , falso, nil , ), (}, P1 , Si, con P1 : T −→ B ( T ) ( T ) | nil
B −→ verdadero | falso
1
f
f
1
0
v
v
1
v
En esta representación, se guardan árboles booleanos. Salvo la raı́z, cada nodo contiene verdadero o falso. Si
un nodo tiene el valor verdadero, entonces la cadena que representa el camino desde la raı́z al nodo pertenece al
conjunto. Si el valor es falso, entonces la cadena no pertenece al conjunto.
El subárbol izquierdo corresponde a las cadenas que empiezan con 0, y el subárbol derecho corresponde a las
cadenas que empiezan con 1. El dı́gito correspondiente al eje que sale de la raı́z del árbol es el de más a la izquierda
en la cadena.
1. (20 pts.) Dar una gramática de precedencia simple para L(G1 ).
2. (20 pts.) Dar una gramática LL(1) para L(G1 ). Construir un analizador sintáctico no recursivo para la
gramatica propuesta y reconocer la cadena (verdadero (nil) (nil)) (nil).
3. (20 pts.) Dar una gramática LALR para L(G1 ).
4. (40 pts.) Dar una traducción dirigida por la sintaxis adornando G1 para que imprima en orden alfabético
ascendente los elementos contenidos en un trie representado por una cadena de L(G1 ). A continuación, debe
imprimir la cantidad de elementos que guarda el trie. Además, debe haber condiciones que indiquen que el
árbol no debe tener nodos innecesarios. Es decir, las hojas deben tener el valor verdadero.
Por ejemplo, si nos dan la cadena
(falso (nil) (verdadero (nil) (verdadero (nil) (nil)))) (falso (verdadero (nil) (nil)) (nil))
que representa el trie de arriba, la traducción deberı́a dar como salida
01
011
10
3
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2008
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
G1 = h{A, B, C}, {num, c, +, ∗, (, )}, P1 , Ei, con P1 :
A −→ A + B | B | (A)
B −→ C ∗ B | C
C −→ num | A | Cc
1. (30 pts) Dar una gramática LALR para L(G1 ).
2. (30 pts) Dar una gramática LL(1) para L(G1 ) y reconocer la cadena
2 + 5 * 3 con un parser no recursivo (el de la tablita...).
3. (40 pts) Dar una gramática de atributos para L(G1 ) que permita obtener el valor de una expresión. c quiere decir elevar al cuadrado. num
tiene un atributo de nombre valor de tipo entero. Solamente se deben aceptar las expresiones que contengan más multiplicaciones que
adiciones.
1
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2009
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
En el lenguaje Perl se pueden escribir listas separando los valores individuales por comas. Al final puede haber una coma opcional. Además, las listas
pueden ser elementos de listas, y la lista vacı́a se representa con ().
La siguiente gramática G describe la sintaxis de las listas en Perl. El terminal n representa una expresión cuyo valor será un miembro de la lista.
G =< {n, ,, (, )}, {L, T }, P, L >, con P :
L −→
|
|
T −→
|
|
L,
L,T
T
n
(L)
()
1. (25 pts) Decidir si G es SLR. En caso contrario dar una gramática que
sea SLR y genere L(G).
2. (25 pts) Decidir si G es LL(1). En caso contrario dar una gramática
que sea LL(1) y genere L(G).
3. (25 pts) Decidir si G es de Precedencia Simple. En caso contrario dar
una gramática que sea de Precedencia Simple y genere L(G).
4. (25 pts) Cuando una lista es miembro de otra lista, el resultado es
equivalente a insertar sus valores en donde ella aparece. Además, las
listas vacı́as son ignoradas. Se pide convertir a G en una traducción
dirigida por sintaxis que imprima la lista resultante, sin coma al final.
Por ejemplo, para la entrada “(),1,(2,3,(4),),(),,5,” se debe imprimir “1,2,3,4,5”. Sólo se deben imprimir paréntesis en el caso de
que la lista de entrada sea equivalente a la lista vacı́a. Por ejemplo, si
la entrada es “(),((),,),” se debe imprimir “()”.
El terminal n tiene un atributo text con el texto de su expresión correspondiente.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2009
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Dada la siguiente gramática G:
G =< {n, ,, +, -}, {S, B, C}, P, S >, con P :
S −→
|
B −→
|
C −→
|
B
C
n
B
n
C
+
, n
, n
1. (25 pts) Decidir si G es SLR. En caso contrario dar una gramática que
sea SLR y genere L(G).
2. (25 pts) Decidir si G es LL(1). En caso contrario dar una gramática
que sea LL(1) y genere L(G).
3. (25 pts) Decidir si G es de Precedencia Simple. Dar su tabla de Precedencia Simple.
4. (25 pts) El terminal n tiene un atributo val de tipo entero. Agregar
atributos a la gramática obtenida en el ejercicio 1 de manera que se
sintetice en un atributo de S el mı́nimo de los valores de la lista si
la cadena de entrada termina con -, y el máximo de los valores si la
cadena termina con +.
1
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2009
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (35 pts) Se necesita parsear una entrada compuesta por items terminados con punto y coma. Cada ı́tem puede ser una cadena de letras,
o una letra seguida de dos puntos y una cadena de letras.
La siguiente gramática genera el lenguaje que se quiere reconocer, el
terminal a representa una letra cualquiera:
G1 =< {a, :, ;}, {A, B}, P1 , A >, con P1 :
A −→
|
|
B −→
Aa:B;
AB;
λ
Ba|λ
(a) Mostrar que G1 no es LR(1).
(b) La siguiente gramática G2 reconoce el mismo lenguaje. Mostrar
que es SLR. Dar su tabla SLR.
G2 =< {a, :, ;}, {A, B, C}, P2 , A >, con P2 :
A −→
|
|
C −→
B −→
A
A
λ
B
B
a:C ;
C ;
|λ
a|a
2. (35 pts) Se escribió también la gramática extendida G3 para L(G1 ):
A −→ ( ( a : a∗ | a∗ ) ; )∗
(a) Mostrar que G3 no es ELL(1).
(b) La siguiente gramática extendida G4 reconoce el mismo lenguaje.
Mostrar que es ELL(1):
A −→ ( ( a ( : a∗ | a∗ ) )? ; )∗
3. (30 pts) Agregar atributos a G1 de manera de rechazar las entradas
en las que haya algún ı́tem de la forma letra:cadena en el que la letra
aparezca en la cadena. El terminal a tiene un atributo letra de tipo
Char.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2009
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La siguiente gramática ambigua representa un fragmento de las expresiones
válidas en el lenguaje de programacion C:
G1 =< {id, ?, :, +}, {E}, P1 , E >, con P1 :
E −→ E ? E : E
E −→ E + E
E −→ id
1. (35 pts) Teniendo en cuenta que el operador ternario condicional ? :
es asociativo a derecha, y tiene menor precedencia que el operador +,
que es asociativo a izquierda, dar una gramática SLR para L(G1 ). Dar
su tabla SLR. Utilizar la tabla para reconocer las cadenas α1 = id ?
id : id + id ? id : id, y α2 = id ? id ? id + id : id : id.
Dar los árboles de derivación obtenidos.
2. (35 pts) Dar una gramática extendida que genere L(G1 ) y sea ELL(1).
3. (30 pts) Agregar atributos y condiciones a G1 de manera que sólo acepte árboles que respeten las precedencias y asociatividades descriptas
en el Ej. 1.
1
Teorı́a de Lenguajes - Segundo Parcial
Primer cuatrimestre de 2010
Apagar los celulares.
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
Consideraremos un lenguaje de expresiones regulares en donde la cadena vacı́a se representa
implı́citamente, en lugar de usar λ como sı́mbolo explı́cito. Por ejemplo, la expresión ‘a|’
representa a|λ, y ‘(|a)b’ representa (λ|a)b.
1. (35 pts) La siguiente gramática ambigua genera el lenguaje descripto. El terminal t
representa los sı́mbolos del alfabeto sobre los que se definen las expresiones regulares:
G1 = h{t, ‘|’, ‘*’, ‘(’, ‘)’}, {E}, P1 , Ei, con P1 :
E
−→
λ | t | E ‘|’ E | E E | E ‘*’ | ‘(’ E ‘)’
(a) Dar la tabla SLR para G1 , señalando todos los conflictos que tenga.
(b) Resolver los conflictos eligiendo en cada caso una de las entradas de la tabla sin
modificar la gramática, de manera que se acepte L(G1 ) y los árboles de derivación
resultantes respeten las siguientes reglas de interpretación:
• λ se entiende implı́cito únicamente cuando no hay otra interpretación posible,
por ejemplo, la cadena ‘a*’ no tiene que interpretarse como aλ∗ . En cambio
la cadena ‘*a’ se interpreta como λ∗ a.
• Como es usual, la concatenación tiene mayor precedencia que la unión, y
ambas son asociativas a izquierda. El operador * tiene mayor precedencia que
la concatenación.
2. (35 pts) La siguiente gramática extendida genera L(G1 ):
GE2 = h{t, ‘|’, ‘*’, ‘(’, ‘)’}, {E, C, U, A}, P2 , Ei, con P2 :
E
C
U
A
−→
−→
−→
−→
C ( ‘|’ C )∗
U+
A ‘*’ ∗
t | ‘(’ E ‘)’ | λ
Decidir si GE2 es ELL(1). Dar el código del parser recursivo-iterativo derivado de GE2 .
En caso de haber conflictos, resolverlos de manera que el lenguaje aceptado sea L(GE2 ).
3. (30 pts) Agregar atributos a G1 de manera que se sintetice una expresión regular que
denote el mismo lenguaje que la cadena de entrada, pero eliminando los usos de la
cadena vacı́a implı́cita, reemplazándolos por el operador ‘?’ de ser necesario (α? es
equivalente a α|λ).
Por ejemplo, si la cadena de entrada es ‘a(b|c)|’, la salida podrı́a ser ‘(a(b|c))?’.
Si el lenguaje denotado por la cadena de entrada es {λ}, producir como salida la cadena
vacı́a.
Asumir que el árbol de derivación se armará según las reglas enunciadas en el ejercicio
1. El terminal t tiene un atributo nombre de tipo String.
1
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Primer cuatrimestre de 2010
Apagar los celulares.
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
La gramática G representa un lenguaje para especificar textos con subı́ndices
y superı́ndices similar al utilizado en el sistema LATEX:
G = h{S, E, F }, {c, _, ^, {, }}, S, P i, con P :
S −→ S E | E
E −→ F
F ^ F |F ^ F
F |F
F |F ^ F |F
F −→ c | { S }
El terminal c representa una letra cualquiera. El sı́mbolo _ significa subı́ndice, ^ significa superı́ndice y las llaves sirven para agrupar. Los siguientes son
algunos ejemplos de expresiones y sus significados:
Expresión
a_b^c
a_ba^c
a_{bc}
ak^{bc_d}_{e^g_h}no^p
Significado
acb
ab ac
abc
akebcgd nop
h
Para una implementación simplificada, consideramos que cada letra aparecerá incluida en una “caja” de tamaño t cuyo vértice inferior izquierdo tiene
coordenadas (x, y) (como se trata de una simplificación, supondremos que la
caja que contiene una letra es cuadrada y que todas las letras son del mismo
tamaño). Para que una letra aparezca como subı́ndice de otra se debe reducir su tamaño un 70 % y desplazar su coordenada y de manera que su caja
quede centrada con respecto a la lı́nea de base original. Para que aparezca
como superı́ndice se debe hacer lo mismo pero dejando la caja centrada con
respecto a la lı́nea superior. La primer letra tendrá t = 1 y (x, y) = (0, 0). El
siguiente gráfico muestra algunas de las coordenadas y tamaños que resultan
de la cadena a^{b^e}_{cd}an^{d_e}
1
0.49
0.7
1
a
(0, 0)
b
e
c d
(1, -0.35)
a n
d
e
(1.7,
-0.35)
1. (33 puntos) Decidir si G es SLR. En caso contrario dar una gramática
SLR que genere L(G) y dar su tabla SLR. Intentar reconocer la cadena
a^b_b^c.
2. (33 puntos) Dar una gramática extendida para L(G) que sea ELL(1).
Dar el código del parser recursivo-iterativo derivado de la misma.
3. (34 puntos) Dar una gramática de atributos que acepte cadenas de
L(G) y asigne a cada terminal c los atributos x, y, y t describiendo la
caja donde se debe ubicar la letra.
2
Teorı́a de Lenguajes - Segundo Parcial
Segundo cuatrimestre de 2010
Apagar los celulares.
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (35 pts) La siguiente gramática genera el lenguaje L de las cadenas formadas por as y
bs terminadas en b:
G1 = h{a, b}, {S, C}, P1 , Si, con P1 :
S
C
−→
−→
C b
aC |bC |λ
Decidir si G1 es SLR. En ese caso, dar su tabla SLR. En caso contrario, dar una
gramática que sea SLR y genere L, y dar su tabla SLR.
2. (30 pts) La siguiente gramática extendida también genera el lenguaje L:
GE2 = h{a, b}, {S}, P2 , Si, con P2 :
S −→ (a|b)∗ b
Decidir si GE2 es ELL(1). En ese caso, dar el parser recursivo-iterativo derivado de
GE2 . En caso contrario, dar una gramática extendida que sea ELL(1) y genere L, y
dar su parser recursivo-iterativo derivado.
3. (35 pts) La siguiente gramática describe la declaración de una variable en un lenguaje
similar a C, que además de los tipos básicos DOUBLE, INT y CHAR cuenta con el tipo
STRUCT, que permite agrupar varios campos disponiéndolos secuencialmente en memoria, y el tipo UNION, que hace que los campos compartan un mismo espacio de memoria,
ocupando el tamaño del campo más grande.
Decl
BaseDecl
U nionDecl
StructDecl
BaseT ype
F ieldList
−→
−→
−→
−→
−→
−→
BaseDecl | U nionDecl | StructDecl
BaseT ype ID ;
UNION {F ieldList} ID ;
STRUCT {F ieldList} ID ;
INT | DOUBLE | CHAR
F ieldList Decl | Decl
Se pide convertirla en una gramática de atributos en la que a cada ID se le asigne su
tamaño en bytes y su offset en memoria con respecto al ID principal. El tipo básico
DOUBLE ocupa 8 bytes, INT 4 bytes, y CHAR ocupa 1 byte. Por ejemplo, para la declaración de la izquierda, se deben asignar los atributos como lo muestra la tabla de la
derecha:
STRUCT {
INT a;
UNION {
INT b;
CHAR c;
DOUBLE d;
} u;
INT e;
} s;
Ident
s
s.a
s.u
s.u.b
s.u.c
s.u.d
s.e
1
Size
16
4
8
4
1
8
4
Offset
0
0
4
4
4
4
12
Teorı́a de Lenguajes
Recuperatorio del Segundo Parcial
Segundo cuatrimestre de 2010
Apagar los celulares.
Hacer cada ejercicio en hojas separadas.
Poner nombre y número de orden en cada ejercicio.
Justificar todas las respuestas.
El examen es a libro abierto.
Se aprueba con 65 puntos.
1. (35 pts) Se quiere reconocer el lenguaje L = {an bm | n > m}, y se cuenta con las
siguiente gramáticas que lo reconocen:
G1 = h{a, b}, {S, A, T }, P1 , Si, con P1 :
S −→ A T
A −→ A a | a
T −→ a T b | λ
G2 = h{a, b}, {S}, P2 , Si, con P2 :
S −→ a S b | a S | a
Para cada Gi , construir su tabla SLR y decidir si se pueden resolver los conflictos
eligiendo en cada caso una de las entradas de la tabla de manera que el lenguaje
aceptado sea L.
2. (35 pts) La siguientes gramáticas extendidas también generan el lenguaje L:
GE3 = h{a, b}, {S, T }, P3 , Si, con P3 :
S −→ a+ T
T −→ ( a T b )?
GE4 = h{a, b}, {S}, P4 , Si, con P4 :
S −→ a ( S b? )?
Para cada GEi , mostrar que no es ELL(1) y decidir si su parser recursivo-iterativo
derivado reconoce L a pesar del conflicto.
3. (30 pts) Dar una gramática de atributos que acepte cadenas del lenguaje:
{ak bω | k ≥ 1 ∧ ω ∈ (a|b)∗ ∧ ak no es subcadena de ω}
1
Descargar