Gramáticas de atributos, DDSs y TDSs

Anuncio
Teorı́a de Lenguajes
Práctica 12
(Gramáticas de atributos, DDSs y TDSs)
Primer cuatrimestre de 2002
1. Determine el conjunto de cadenas generadas por la siguiente gramática de
atributos :
G = hVN , VT , P, < ss >i
Donde:
VN = {< ss >, < xs >, < ys >, < zs >}
VT = {x, y, z}
Size es un atributo sintetizado de < xs > y un atributo heredado de
< ys > y < zs >.
P:
< ss >
::= < xs >< ys >< zs >
{< ys > .size =< xs > .size
< zs > .size =< xs > .size}
< xs > ::= x
{< xs > .size = 1}
| < xs >2 x
{< xs >. size =< xs >2 .size + 1}
< ys > ::= y
{condition :< ys > .size = 1}
| < ys >2 y
{< ys >2 .size =< ys > .size − 1}
< zs > ::= z
{condition :< zs > .size = 1}
| < zs >2 z
{< zs >2 .size =< zs > .size − 1}
2. Sin cambiar el lenguaje generado, modificar la gramática del ejercicio 1
para que size se utilice sólo como atributo sintetizado.
3. Dada la siguiente gramática que genera árboles binarios rotulados:
S −→ SCS | C
1
C −→ C0 | C1 | . . . | C9 | 0 | 1 | . . . | 9
(a) Si consideramos el árbol binario como la abstracción de un móvil donde el valor del nodo corresponde al peso de la varilla y el valor de las
hojas al de los objetos colgantes, agregarle atributos a la gramática
para que se generen sólo móviles equilibrados.
(b) Agregar atributos a la gramática para que el árbol binario represente
un ordenamiento binario.
4. Dada la siguiente gramática que genera expresiones aritméticas de suma y
producto, definir un atributo exp que sintetice la expresión generada pero
sin paréntesis redundantes.
E −→ E + T | T
T −→ T ∗ F | F
F −→ id | (E)
5. Construir el árbol de derivación anotado para las siguientes cadenas1 .
(a) (4 ∗ 7 + 1) ∗ 2 para la DDS de la Fig. 5.2.
(b) int id1 id2 id3 para la DDS de la Fig. 5.4.
6. Extender la DDS de la Fig. 5.9 para que incluya las operaciones ∗, %
y ∗∗. Construir el árbol sintáctico resultante del parsing de la cadena :
B + 3 ∗ C ∗ ∗ 4.
7. La gramática G = hVT , VN , E, P i, donde:
VT = {num, .}
VN = {E, T }
P =
E −→ E + T | T
T −→ num.num | num
genera expresiones formadas por la aplicación del operador + a constantes
enteras y reales. Cuando se suman dos enteros, el resultado es entero, y
en cualquier otro caso es real.
(a) Escribir una definición guiada por sintaxis que determine el tipo de
las expresiones generadas por G.
(b) Extender la definición de (a) para que además traduzca las expresiones a notación postfija. Los dos operandos del + deben ser del
mismo tipo, y para esto se debe usar el operador unario a real que
convierte un valor entero a un valor real equivalente.
8. Dada la gramática G = hVT , VN , D, P i donde:
1 Libro
“Compiladores, principios, técnicas y herramientas” Aho, Sethi y Ullman
2
VT = {id, , , :, integer, real}
VN = {D, L, T }
P =
D −→ idL
L −→, idL | : T
T −→ integer | real
(a) Construir un esquema de traducción que coloque el tipo de cada
identificador en la tabla de sı́mbolos.
(b) Construir un parser predictivo para el esquema de (a)
9. Construir un parser recursivo descendente que implemente la gramatica
de atributos del ejercicio 5. Se debe mostrar por pantalla el valor del
atributo exp.
10. Construir una DDS que permita reconocer pares de hora:minuto (am/pm)
válidas, y se determine, en el valor del atributo dif erencia del sı́mbolo
distinguido, el nro. de minutos que transcurrieron entre ambas horas. Por
ejemplo, si la entrada es ‘7:25am - 3:31pm’, el valor deberá ser 486; si es
‘0:10am - 11:59am’, dicho valor deberá ser 709.
11. Construir una DDS que permita reconocer expresiones aritméticas (+, −, ∗)
con notación posfijo (notación “polaca inversa” o RPN), utilizando los
dı́gitos del 0 al 9, sintetizando y/o heredando atributos según sea necesario, y tal que en el atributo val del sı́mbolo distinguido se obtenga el
resultado de la operación. Por ej, la expresión (25 − 8) ∗ 4 − (2 + 13) se
representa en RPN como 25 8 − 4 ∗ 2 13 + −
3
Descargar