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