You are on page 1of 24

GRAMÁTICAS ATRIBUIDAS

Autómatas y Compiladores
Ing. Carlos Gaytán Toledo

20/11/2018 1
Gramática con Atributos (GA)
• Son ampliaciones de las GLC donde:
– Los símbolos gramaticales pueden tener asociados
atributos.
– Las reglas de producción pueden tener asociadas reglas
de evaluación de los atributos (reglas semánticas).

• Para evaluar con una GA se reconocen los tokens, se


construye el árbol sintáctico y finalmente se recorre el
árbol para evaluar las reglas semánticas de sus nodos.

20/11/2018 2
Atributos
• Representan propiedades (información semántica) de las
partes de un Lenguaje de Programación.
• Varían en cuanto a información que contienen y/o en cuanto
al tiempo que tardan en calcularse.
• Cada símbolo gramatical puede tener asociado cero o mas
atributos.
• Se utiliza la notación símbolo.atributo. Por ejemplo:
id.lexema, Exp.valor, LstIds.cantidad
• Cada atributo tiene un conjunto de posibles valores
(dominio).

20/11/2018 3
Reglas Semánticas
• Especifican el cálculo de los atributos mediante relaciones
entre los atributos definidos sobre la GA.
• Dada una producción X0X1X2...Xn, una regla semántica es
una función matemática de la forma:

• Las reglas semánticas se asocian a las producciones,


escribiéndolas a su lado derecho:

20/11/2018 4
Reglas Semánticas
• Las reglas semánticas deben calcular todos los valores de los
atributos necesarios en los nodos del árbol.
• Los atributos de los símbolos terminales son calculados y
entregados generalmente por el analizador léxico.
• Se utiliza subíndices para referirnos a los atributos de un
símbolo gramatical que aparece varias veces en una
producción.
• Notación:
– Operador de asignación :=
– Operador de concatenación de cadenas ||

20/11/2018 5
Gramática con Atributos (GA)
• Ejemplo: GA que traduce declaraciones de variables
en C a declaraciones en Pascal

Producción Reglas semánticas


S  T id L ; S.trad:=”var”||id.lexema||L.trad||”:”||T.trad||”;”
L1  , id L2 L1.trad:=”,”||id.lexema||L2.trad
L L.trad:=””
T  float T.trad:=”real”
T  int T.trad:=”integer”

20/11/2018 6
Atributos Sintetizados (AS)
• Se calculan a partir de los atributos de los nodos hijos en el
árbol.
A A.a = f(B.b, C.c, D.d)

B C D
B.b C.c D.d

• Pasan información hacia arriba


• Se calculan en analizadores sintácticos ascendentes.
• Se refieren a atributos del antecedente de la regla.
• Los atributos de los terminarles son sintetizados

20/11/2018 7
Atributos Sintetizados (AS)
• Gramática S-atribuida: son gramática atribuidas
donde todos los atributos asociados con los símbolos
gramaticales son sintetizados.
• Las reglas de evaluación de los atributos sintetizados
se realizan durante el análisis sintáctico ascendente.

20/11/2018 8
Atributos Sintetizados (AS)
• Ejemplo: gramática S-Atribuida que evalúa expresiones
aritméticas
Producciones Reglas Semánticas
E1  E2 + T E1.val := E2.val + T.val
E1  E2 – T E1.val := E2.val - T.val
ET E.val := T.val
T1  T2 * F T1.val := T2.val * F.val
TF T.val := F.val
F(E) F.val := E.val
F  num F.val := num.val
20/11/2018 9
Atributos Sintetizados (AS)
• Evaluación de (4-3)*2

20/11/2018 10
Atributos Sintetizados (AS)
• Evaluación de 3*5+4

20/11/2018 11
Atributos Heredados (AH)
• Calculados con atributos de nodos padre y hermanos
A A.a

B C D
B.b = f(A.a, C.c, D.d) C.c D.d

• Se refieren a atributos del consecuente de la regla


• Información descendente o de tránsito horizontal
• Se calculan en analizadores sintácticos descendentes.
• Los atributos heredados lo son durante toda la gramática
• Se utilizan para transferir información entre reglas

20/11/2018 12
Atributos Heredados (AH)
• Ejemplo: GA que evalúa la declaración de variables en C.

Producción Reglas Semánticas


Decl  Type Var_List Var_List.type := Type.type
Type  int Type.type := entero
Type  float Type.type := real
Var_List1  id , Var_List2 id.type := Var_List1.type;
Var_List2.type := Var_List1.type
Var_List  id id.type := Var_List.type

20/11/2018 13
Atributos Heredados (AH)
• Evaluar la GA para la entrada: float x,y

20/11/2018 14
Gramáticas L-Atribuidas
• Los AH asociados al consecuente se
calculan en función de:
1. AH asociados al antecedente de la
producción
2. Atributos ubicados a la izquierda
del símbolo dentro del consecuente
• Los AS asociados al antecedente se
calculan en función de:
3. AH asociados al antecedente
4. Atributos asociados a símbolos del
consecuente.
• Los atributos se evalúan durante el
Análisis Sintáctico Descendente.
20/11/2018 15
Especificación de un traductor
• 2 notaciones
• Definiciones dirigidas por la sintaxis (DDS)
– Formalismo de alto nivel para describir traducciones
– Se ocultan los detalles de implementación
– No se impone orden de ejecución de las reglas
– Calcular los atributos en la producción en que aparecen
• Esquemas de traducción (ETDS)
– Notación de bajo nivel para especificar un traductor
– El traductor es de una sola pasada
– Explicita el orden de la ejecución de las acciones

20/11/2018 16
Definición Dirigida por Sintaxis (DDS)
• Son una generalización de las gramáticas con atributos
– Toda gramática con atributos es una DDS
• Todas las reglas semánticas aparecen al final de la producción:
– A  X1 X2 X3...Xn {R0,R1,R2,…,Rn}
• Las reglas semánticas manipulan atributos.
• Existen otras acciones semánticas que no manipulan atributos:
– Escritura de valores
– Condicionales
– Inserción de variables en la tabla de símbolos
– Modificación de variables globales
• Son utilizadas preferentemente en el análisis sintáctico ascendente.

20/11/2018 17
Definición Dirigida por Sintaxis (DDS)
• Ejemplo:
Regla de producción Regla semántica
E  E1 OP T if (OP.lexema == ‘+’) {
E.valor := E1.valor + T.valor
}
else {
E.valor := E1.valor + T.valor
}
write(E.valor)

20/11/2018 18
Esquema de Traducción Dirigido por
Sintaxis (ETDS)
• Traductores de una sola pasada
• Acciones semánticas entre los símbolos del consecuente
• A  {R0} X1 {R1} X2 {R2} X3...Xn {Rn}
• Se encierran entre llaves {acción semántica}
• Son fragmentos de código en un lenguaje de programación
• Se explicita el orden de ejecución de las acciones
• Al diseñar un ETDS, se debe verificar que el valor de un
atributo esté disponible cuando sea referido.
• Son utilizados preferentemente en el análisis sintáctico
descendente.

20/11/2018 19
Esquema de Traducción Dirigido por
Sintaxis (ETDS)
• Ejemplo: evaluar la cadena 9-5+2 con el ETDS:

E  T {E’.th := T.ts} E’ {E.ts := E’.ts}


E’  op T {E’1.th := E’.th || T.ts || op.lexema} E’1 {E’.ts := E’1.ts}
E’   {E’.ts := E’.th}
T  num {T.ts := num.lexema}

20/11/2018 20
Restricciones de Diseño
• Para calcular AS, colocar la acción semántica después de
todos los símbolos implicados o al final de la producción.
A  B C { A.a = f (B.a, C.a) } D
A  B C D { A.a = f (B.a, C.a) }

• Para calcular AH, colocar la acción semántica antes de


que aparezca el símbolo en el consecuente.
A  B C { D.h = f (B.a, C.a) } D

20/11/2018 21
Restricciones de Diseño
• Un AS debe usarse después de que aparezca el símbolo en el
consecuente.
Error ! A  B { A.s = f (B.s, C.s) } C D
Correcto ! A  B C { A.s = f (B.s, C.s) } D

• Las acciones con efectos laterales deben situarse en el punto


exacto del consecuente de la regla en la que deberían
evaluarse.
– Verificar que no utilicen atributos de símbolos situados a la
derecha de dicho punto.

20/11/2018 22
Pasos de diseño de un ETDS
1. Decidir qué atributos son necesarios
2. Añadir a la gramática las acciones semánticas necesarias
3. Estudiar de qué tipo es cada atributo:
– Sintetizado
– Heredado
4. Comprobar que se cumplen las restricciones de diseño
– Estudiar grafo de dependencias
– Modificar la gramática
– Reubicar las acciones semánticas

20/11/2018 23
Conversión de ETDS a DDS
• Se transforma la GA para • Ejemplo: Sea el ETDS:
que todas las acciones ETR
intercaladas en un ETDS, R  + T {print('+')} R
queden al final de sus | - T {print('-')} R
producciones. |
– Se reemplaza cada T  num {print(num.val)}
acción intercalada por • ETDS transformada:
un símbolo no ETR
terminal M (marcador) R+TMR
distinto |-TNR
|
– Se asocia la acción T  num {print(num.val)}
reemplazada al final de M   {print('+')}
la producción M   N   {print('-')}

20/11/2018 24

You might also like