4.1 Atributos y Gramáticas con Atributos
Informalmente, se llamará atributos de un símbolo de la gramática a toda información añadida en el árbol de derivación por el analizador semántico, asociada a los símbolos de los nodos anotados. Un componente importante de las gramáticas de atributos es el algoritmo de cálculo de los valores.
Una gramática de atributos es una gramática independiente del contexto en la cual a sus símbolos terminales y no terminales se les dota de unos atributos y a sus producciones de unas funciones de evaluación que hacen que dichos atributos se propaguen a través de la gramática. Su fin es conocer un determinado valor de un atributo en cualquier parte del árbol de derivación y tomar la decisión oportuna. Un atributo es una propiedad asociada a una estructura sintáctica. Si una estructura sintáctica representada por el símbolo gramatical X tiene asociado un atributo a lo representaremos por X.a (Nombre símbolo.Nombre atributo) • Ejemplo: numero -> numero digito | digito a) numero-> digito numero.valor = digito.valor b) numero -> numero digito numero1.valor = numero2.valor * 10 + digito.valor Las funciones semánticas relacionan los valores de los atributos definidos sobre la gramática atribuida y van asociadas a producciones de la gramática atribuida.
Ejemplo: Sea el lenguaje L={an |n>=0} generado por la siguiente gramática:
G={ ∑={a, $}, N={S, A}, S, P) P: S→A$ A→aA A→a
Se quiere atribuir para que contabilice y escriba el número de aes que tiene una palabra generada. |
S→A$ {writeln (A.num)} A→aA {A1.num=1+A2.num} A→a {A.num=1} |
|
Definición formal Una gramática de atributos está formada por una tripleta GA={GIC, A, F} G – gramática independiente del contexto A – atributos asociados a los símbolos terminales y no terminales F – función de evaluación, función asociada a producción que determina como obtener unos atributos en función de otros dentro de la misma producción
A→X1 X2 X3 …Xn ; A∈N y Xi∈(Σ|N) A.a=f (X1.a,X2.b,…Xm.z)
a es un atributo asociado al símbolo no terminal A y obtiene su valor en función de los atributos: a asociado a X1, b asociado a X2 ,…y z asociado a Xm ( es un atributo obtenido en función de la parte derecha de la producción)
X1.a=f (A.a,X2.b)
a es un atributo asociado al símbolo X1 y obtiene su valor en función de los atributos: a asociado a A, b asociado a X2 ( es un atributo obtenido en función de elementos de la parte derecha e izquierda de la producción)
A.a=f (y1.b, B.a) , X1.a=f (y1.b, B.a) Atributos incorrectos no se obtienen dentro de la producción Tipos de atributos:
A→X1 X2 X3 …Xn ; A∈N y Xi∈(Σ|N) A.a=f(X1.a,X2.b,…Xm.z) a es un atributo sintetizado obtienen sus valores de los atributos de un nivel inferior en la generación del árbol, es decir de la parte derecha de la producción |
S→A$ {writeln (A.num)} A→aA {A1.num=1+A2.num} A→a {A.num=1} |
X1.a=f(A.a,X2.b,…) a es un atributo heredado obtenido en función de los atributos a y b obtiene sus valores de los atributos del mismo nivel o superior en la generación del árbol, es decir se calculan descendentemente |
S→A$ {A.num=0} A→aA {A2.num=1+A1.num} A→a {writeln (A.num+1} |
|
S→A$ {writeln (A.num)} A→aA {A1.num=1+A2.num} A→a {A.num=1} |
|
Poder de significación de las gramáticas de atributos La gramáticas de atributos tienen un mayor poder de significación que una gramática independiente del contexto. Puede reconocer lenguajes de tipo superior, es decir de tipo 1 o tipo 0 . Sea el lenguaje L={ an bn cn| n>=0} es un lenguaje de tipo 1, solo puede ser generado por una gramática de tipo 1 o 0 . Se puede construir una gramática de atributos GA=( GIC, A, F) que genere dicho lenguaje: Sea la gramática: S→AB A→aAb |ε B→cB |ε que genera el lenguaje L={anbncm| n>=0,m>=0} Podemos atribuirla para que genere el lenguaje L={anbncn| n>=0} Atributos, necesarios para contabilizar las aes, bes y ces: num_ab atributo sintetizado asociado a A y num_c atributo sintetizado asociado a B Funciones asociadas a las producciones necesarias para la propagación de los atributos:
S→AB {IF A.num_ab<>B.num_c Then error semántico} A→aAb {A1.num_ab=A2.num_ab+1} |ε {A1.num_ab=0} B→cB {B1..num_c=B2.num_c+1} |ε {B.num_c=0}
|