Sei sulla pagina 1di 69

1

Traduccin dirigida por la


sintaxis
2
INDICE
1. Gramticas con atributos
2. Evaluacin de los atributos
2.1 Evaluacin mediante grafos
2.2 Evaluacin durante el parsing
2.2.1 Esquemas de traduccin
2.2.2 Traduccin top-down
2.2.3 Traduccin bottom-up
3
1. Gramticas con atributos
Cada smbolo de una gramtica puede tener asociados
uno o ms atributos.
Los atributos pueden ser de cualquier tipo de dato, y su
significado depende del programador (valor de una
constante, valor de una expresin, puntero, etc)
N A t B C
Representacin: N.n A.a t.t B.b C.c
4
Tipos de atributos
1. Sintetizados
2. Heredados
Sintetizados
N A B C
N.s = f ( A.a , B.b , C.c , N.i )
N.i : atributos que N hereda de su padre o sus
hermanos
5
Tipos de atributos
Heredados
N A B C
B.i = f (A.a , B.b , C.c , N.n)
6
Especificacin de atributos: reglas semnticas
Reglas Reglas semnticas
A B C D A.a = B.b + C.c
D.i = B.b C.c
C E F C.c = E.e * F.f
Reglas + Reglas semnticas
=
Definicin dirigida por sintaxis
7
Ejemplo 1: definicin dirigida por sintaxis
REGLAS REGLAS SEMNTICAS
L E \n print (E.val)
E E
1
+ T E.val = E
1
.val + T.val
E T E.val = T.val
T T
1
* F T.val = T
1
.val * F.val
T F T.val = F.val
F ( E ) F.val = E.val
F cte F.val = cte.val
8
Ejemplo 1: rbol sintctico ilustrativo
L
\ n E
E
+
T
T
F
c te
3
T
F
F
c te
5
cte
4
*
+
*
(val =3) (val =5)
(val = 4)
(val = 3)
(val =3)
(val =3)
(val=5)
(val = 5)
(val =4)
(val=20)
(val=23)
print (23)
9
Ejemplo 2: definicin dirigida por sintaxis
REGLAS REGLAS SEMNTICAS
D T L L.i = T.type
T int T.type = 0
T real T.type = 1
L L
1
, id L
1
.i = L.i
save(id.ptr , L.i)
L id save(id.ptr ,L.i)
10
Ejemplo 2: rbol sintctico ilustrativo
D
i n t
i n t
b
c
a
,
( t y p e = 0 ) T
L
L , i d
L
,
i d
,
i d
( i = 0 )
( i = 0 )
( i = 0 )
11
Ejemplo 3: definicin dirigida por sintaxis
REGLAS REGLAS SEMNTICAS
E E
1
+ T E.ptr = makenode (+ , E
1
.ptr , T.ptr)
E E
1
T E.ptr = makenode (- , E
1
.ptr , T.ptr)
E T E.ptr = T.ptr
T ( E ) T.ptr = E.ptr
T id T.ptr = makeleaf (id , id.ptr)
T cte T.ptr = makeleaf (cte , cte.valor)
12
Ejemplo 3: rbol sintctico ilustrativo
E
b a 5
-
( p t r )
+
E +
T
E
- T
i d
c t e
T
i d
i d c te 5
i d
( p t r )
( p t r )
( p t r )
( p t r )
( p t r )
+
-
a b
13
NDICE
1. Gramticas con atributos
2. Evaluacin de los atributos
2.1 Evaluacin mediante grafos
2.2 Evaluacin durante el parsing
2.2.1 Esquemas de traduccin
2.2.2 Traduccin top-down
2.2.3 Traduccin bottom-up
14
2. EVALUACIN DE LOS ATRIBUTOS
Una Definicin dirigida por sintaxis especifica el valor de
los atributos, pero no especifica la forma de evaluacin.
Existen 2 tipos de mtodos para la evaluacin:
2.1 Evaluacin mediante grafos: la evaluacin es
independiente del reconocimiento sintctico
(parsing).
2.2 Evaluacin durante el parsing: la evaluacin se
produce durante el reconocimiento sintctico.
15
2.1 Evaluacin mediante grafos
METODOLOGA
Durante el proceso de parsing se genera el grafo de
dependencias de los atributos.
Posteriormente, se computan los valores de los
atributos respetando el orden parcial impuesto por el
grafo de dependencias.
16
Ejemplo
REGLAS REGLAS SEMNTICAS
E E
1
+ E
2
E.val = E
1
.val + E
2
.val
E E
1
* E
2
E.val = E
1
.val * E
2
.val
E ( E
1
) E.val = E
1
.val
E - E
1
E.val = - E
1
.val
E cte E.val = cte.val
17
rbol sintctico y grafo de dependencias
E
E
+
E
E
-
cte
2
E
E
-
cte
3
cte
5
*
+
*
2
2
-2
3
5
3
5
15
13
rbol si ntcti co
Grafo de dependenci as
18
Ventajas y desventajas
Ventaja importante
La evaluacin mediante grafos es vlida para cualquier
definicin dirigida por sintaxis (que no contenga ciclos)
Desventajas
Hay que construir un grafo que puede ser enorme
(ESPACIO y TIEMPO) y la evaluacin se realiza
despus de finalizar el anlisis sintctico (la evaluacin
durante el parsing es un poco ms intuitiva)
19
2.2 Evaluacin durante el parsing
Se trata de evaluar los atributos durante el proceso de
parsing.
Ventajas
No se precisa de grafo de dependencias, y la evaluacin
es un poco ms intuitiva.
Desventaja principal
No es una metodologa vlida para todo tipo de
definiciones dirigidas por sintaxis.
20
2.2.1 Esquemas de traduccin
Un esquema de traduccin especifica la forma en que se
van a evaluar los atributos durante un proceso de
parsing.
Reglas sintcticas
+ } Definicin dirigida por sintaxis
Reglas semnticas
21
Esquemas de traduccin
Reglas sintcticas
+ } Esquema de traduccin
ACCIONES
N A { accin_1 } B C { accin_2 }
22
Diseo del esquema de traduccin
Dada una definicin dirigida por sintaxis
Cmo diseamos el esquema de traduccin ?
El diseo del esquema de traduccin depende del tipo
de recorrido que se realiza durante el proceso de
parsing. Fundamentalmente tenemos 2 tipos de diseo:
2.2.2 Traduccin top-down
2.2.3 Traduccin bottom-up
23
2.2.2 Esquemas de traduccin top-down
A. Diseo del esquema de traduccin
B. Implementacin del esquema de
traduccin
C. Soluciones para algunos problemas
24
A. Diseo de esquemas de traduccin top-down
N A B C
Atributos sintetizados
N.s = f ( A.a , B.b , C.c , N.i )
Atributos heredados
B.i = f (A.a , B.b , C.c , N.n)
25
Metodologa
1. El clculo de un atributo sintetizado se realiza
al final del procedimiento del no-terminal
correspondiente.
2. El clculo de un atributo heredado se realiza
antes de la llamada al procedimiento del no-
terminal correspondiente.
26
Ejemplo 1 (I): definicin dirigida por sintaxis
REGLAS REGLAS SEMNTICAS
E E
1
+ E
2
E.val = E
1
.val + E
2
.val
E E
1
* E
2
E.val = E
1
.val * E
2
.val
E ( E
1
) E.val = E
1
.val
E - E
1
E.val = - E
1
.val
E cte E.val = cte.val
27
Ejemplo 1 (II): esquema de traduccin top-down
REGLAS y ACCIONES
E E
1
+ E
2
{ E.val = E
1
.val + E
2
.val } A1
E E
1
* E
2
{ E.val = E
1
.val * E
2
.val } A2
E ( E
1
) { E.val = E
1
.val } A3
E - E
1
{ E.val = - E
1
.val } A4
E cte { E.val = cte.val } A5
28
Ejemplo 1 (III): rbol sintctico con las acciones
E
E
+
E
E
-
cte
2
E
E
-
cte
3
cte
5
*
+
*
A1
A2 A4
A5
A5
A5
29
REGLAS REGLAS SEMNTICAS
D T L L.i = T.type
T int T.type = 0
T real T.type = 1
L L
1
, id L
1
.i = L.i
save(id.ptr , L.i)
L id save(id.ptr ,L.i)
Ejemplo 2 (I): definicin dirigida por sintaxis
30
Ejemplo 2 (II): esquema de traduccin top-down
REGLAS y ACCIONES
D T { L.i = T.type } L A1
T int { T.type = 0 } A2
T real { T.type = 1 } A3
L { L
1
.i = L.i } L
1
, id { save(id.ptr , L.i) } A4,A5
L id { save(id.ptr ,L.i) } A6
31
Ejemplo 2 (III): rbol sintctico con las acciones
D
i n t
i n t
b
c
a
,
T L
L , i d
L
,
i d
,
i d
A 1
A 2
A 5 A 4
A 4 A 5
A 6
32
Restricciones
Se puede disear un esquema de traduccin top-down
para cualquier definicin dirigida por sintaxis ?
REGLAS REGLAS SEMNTICAS
N A B C B.i = f (C.s)
B D F B.s = g (D.s, F.s, B.i)
No podemos disear un esquema de traduccin top-
down para esta definicin dirigida por sintaxis.
33
Clasificacin de las definiciones dirigidas por
sintaxis
S-Attributed
Solamente contienen atributos de tipo sintetizado.
L-Attributed
Contienen atributos sintetizados y heredados, pero stos
ltimos tienen la siguiente restriccin:
A X
1
X
2
X
j
X
k
.i = f (X
1
.x
1
, X
2
.x
2
, , X
k-1
.x
k-1
, A.i)
34
Validez del esquema de traduccin top-down
La metodologa mostrada anteriormente para
disear el esquema de traduccin para
reconocedores top-down
solamente es vlida
para definiciones dirigidas por sintaxis que sean
L-Attributed (por supuesto, estn incluidas las
definiciones S-Attributed)
35
B. Implementacin de esquemas de traduccin
top-down
Hay que modificar el parser top-down considerando:
1. Cada procedimiento recibe los atributos heredados a travs
de su lista de parmetros.
2. Las acciones correspondientes al clculo de atributos
deben insertarse en los puntos correspondientes de cada
procedimiento.
3. Al final de cada procedimiento deben evaluarse los
atributos sintetizados, que deben ser retornados por el
procedimiento.
36
Ejemplo general
N { A1 } A { A2 } B { A3 } C { A4 }
Procedure N (Atributos que N hereda)
{ A1 } / Clculo de atributos que A hereda
A.s = A (Atributos que A hereda)
{ A2 } / Clculo de atributos que B hereda
B.s = B (Atributos que B hereda)
{ A3 } / Clculo de atributos que C hereda
C.s = C (Atributos que C hereda)
{ A4 } / Clculo de atributos que N sintetiza
N.s = f (A.a, B.b, C.c, N.i)
return (N.s)
37
Ejemplo (I): definicin dirigida por sintaxis
REGLAS REGLAS SEMNTICAS
D T L L.i = T.type
T int T.type = 0
T real T.type = 1
L L
1
, id L
1
.i = L.i
save(id.ptr , L.i)
L id save(id.ptr ,L.i)
38
Ejemplo (II): esquema de traduccin top-down
REGLAS y ACCIONES
D T { L.i = T.type } L
T int { T.type = 0 }
T real { T.type = 1 }
L { L
1
.i = L.i } L
1
, id { save(id.ptr , L.i) }
L id { save(id.ptr ,L.i) }
39
Ejemplo (III): implementacin del esquema de
traduccin
Procedure D ( ) Procedure T ( )
if (lookahead= int)
T.type = T ( ); newlookahead;
{ T.type = 0; }
{ L.i = T.type; } return (T.type);
if (lookahead=real)
L (L.i); newlookahead;
{ T.type = 1; }
return (T.type)
error ();
40
Ejemplo (III): implementacin del esquema de
traduccin
Procedure L (L.i) OJO !! No podemos
implementar L correctamente
Si aplicamos la regla: L L , id debido a la recursividad por
la izquierda
{ L
1
.i = L.i; }
L (L
1
.i);
if (lookahead=,) newlookahead else error ();
if (lookahead=id) newlookahead else error ();
save (id.ptr, L.i);
Si aplicamos la regla: Lid
if (lookahead=id) newlookahead else error ();
save (id.ptr, L.i);
41
C. Soluciones para algunos problemas
Los esquemas de traduccin top-down tienen
problemas de implementacin cuando aparecen
2 tipos de situaciones:
C1. Recursividad por la izquierda
C2. Factorizacin
42
C1. Recursividad por la izquierda
Reglas + Acciones
E E
1
+ T { E.val = E
1
.val + T.val }
E E
1
- T { E.val = E
1
.val - T.val }
E T { E.val = T.val }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
Eliminando la recursividad por la izquierda tal como
hemos visto hasta ahora, nos quedara el siguiente
esquema:
43
Problema al eliminar la recursividad por la
izquierda
E T { E.val = T.val } R
R + T { E.val = E
1
.val + T.val } R
| - T { E.val = E
1
.val - T.val } R
|
T ( E ) { T.val = E.val }
T num { T.val = num.val }
44
Posible solucin: recursividad por la derecha
Reglas + Acciones
E T + E
1
{ E.val = T.val + E
1
.val}
E T - E
1
{ E.val = T.val - E
1
.val}
E T { E.val = T.val }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
Esta solucin no es vlida porque no conserva la
asociatividad por la izquierda de los operadores.
45
Asociatividad incorrecta: ilustracin
E
T
-
E
num
3
T
E
num
5
num
1
+
-
+
T
(6)
(1)
(1)
(5)
(5)
(-3)
(3)
(3)
46
Una solucin vlida: cambiar las reglas
semnticas
Reglas Reglas semnticas
E T R { R.i=T.val ; E.s=R.s }
R + T R
1
{ R
1
.i=R.i + T.val ; R.s=R
1
.s }
| - T R
1
{ R
1
.i=R.i - T.val ; R.s=R
1
.s }
| { R.s=R.i }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
47
Esquema grfico de los atributos
E
T
-
R
num
3
T
R num
5
num
1
R
-
+
T (i)
(s)
(i)
+

(i)
(s)
(s)
(s)
(val)
(val)
(val)
48
Esquema de traduccin resultante
Reglas + Acciones
E T { R.i=T.val } R { E.s=R.s }
R + T { R
1
.i=R.i + T.val } R
1
{ R.s=R
1
.s }
| - T { R
1
.i=R.i - T.val } R
1
{ R.s=R
1
.s }
| { R.s=R.i }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
49
Implementacin del esquema
Se deja como prctica de laboratorio
50
Generalizacin (para atributos sintetizados)
Sea la siguiente definicin dirigida por sintaxis, y sea un
atributo sintetizado a genrico:
A A
1
Y A.a=g(A
1
.a, Y.y)
A X A.a=f(X.x)
Para una derivacin a izquierdas genrica tenemos:
A A Y
2
A Y
1
Y
2
X Y
1
Y
2
A.a=g( g( f(X.x), Y
1
.y), Y
2
.y)
51
Grficamente
A
Y
2
(a)
(a)
(a)
A
A
Y
1
X
(y)
(y)
f(X.x)
g( f(X.x), Y
1
.y )
g( g(f(X.x), Y
1
.y), Y
2
.y)
52
Solucin para atributos sintetizados
Eliminar recursividad + redefinir las reglas semnticas
REGLAS REGLAS SEMNTICAS
A X R R.i=f(X.x); A.s=R.s
R Y R
1
R
1
.i=g(R.i,Y.y); R.s=R
1
.s
R R.s=R.i
A continuacin lo expresamos grficamente
53
Grficamente
A
R
(y)
(s)
(y)
X
Y
1
Y
2

i=g( f(X.x), Y
1
.y )
i=g( g(f(X.x), Y
1
.y), Y
2
.y)
R
R
(x)
i=f(X.x) (s)
(s)
(s=i)
54
Esquema de traduccin
A X { R.i=f(X.x) }
R { A.s=R.s }
R Y { R
1
.i=g(R.i, Y.y) }
R
1
{ R.s=R
1
.s }
R { R.s=R.i }
55
Generalizacin para atributos heredados por copia
Sea la siguiente definicin dirigida por sintaxis, y sea un
atributo heredado por copia i genrico:
A A
1
Y A.a=g(A
1
.a, Y.y); A
1
.i=A.i
A X A.a=f(X.x, A.i)
Para una derivacin a izquierdas genrica tenemos:
A
1
A
2
Y
2
A
3
Y
1
Y
2
X Y
1
Y
2
A.a=g( g( f(X.x, A
3
.i), Y
1
.y), Y
2
.y)
56
Grficamente
A
1
Y
2
(a)
(a)
(a)
A
2
A
3
Y
1
X
(y)
(y)
f(X.x, A
3
.i=v)
g( f(X.x, v), Y
1
.y )
g( g(f(X.x, v), Y
1
.y), Y
2
.y)
(x)
(i)
(i)
(i=v)
57
Solucin para atributos heredados por copia
Eliminar recursividad + redefinir las reglas semnticas
REGLAS REGLAS SEMNTICAS
A X R R.i=f(X.x, A.i=v); A.s=R.s
R Y R
1
R
1
.i=g(R.i,Y.y); R.s=R
1
.s
R R.s=R.i
A continuacin lo expresamos grficamente
58
Grficamente
A
R
(y)
(s)
(y)
X
Y
1
Y
2

i=g( f(X.x,v), Y
1
.y )
i=g(g(f(X.x,v), Y
1
.y), Y
2
.y)
R
R
(x)
i=f(X.x,v)
(s)
(s)
(s=i)
(i=v)
59
Generalizacin para atributos heredados
genricos
Sea la siguiente definicin dirigida por sintaxis, y sea un atributo
heredado genrico i :
A A
1
Y A.a=g(A
1
.a, Y.y); A
1
.i=h(A.i)
A X A.a=f(X.x, A.i)
Sea h(A.i)=A.i +1 (sea cero su valor en el primer nodo A)
Para una derivacin a izquierdas genrica tenemos:
A
1
A
2
Y
2
A
3
Y
1
Y
2
X Y
1
Y
2
A.a=g( g( f(X.x, A
3
.i), Y
1
.y), Y
2
.y)
60
Grficamente
A
Y
2
(a)
(a)
(a)
A
A
Y
1
X
(y)
(y)
f(X.x, 2)
g( f(X.x, 2), Y
1
.y )
g( g(f(X.x, 2), Y
1
.y), Y
2
.y)
(x)
(i=2)
(i=1)
(i=0)
61
Solucin para atributos heredados genricos
Eliminar recursividad + redefinir las reglas semnticas
REGLAS REGLAS SEMNTICAS
A X R R.i=f(X.x, ???? ); A.s=R.s
R Y R
1
R
1
.i=g(R.i,Y.y); R.s=R
1
.s
R R.s=R.i
No conocemos el valor final del atributo heredado por A hasta que
se recorre todo el rbol hacia abajo. Sin embargo, necesitamos su
valor para los cmputos que se realizan al bajar en el rbol. Por
tanto, para este tipo de definiciones dirigidas por sintaxis no
podemos utilizar reconocedores top-down.
A continuacin lo expresamos grficamente
62
Grficamente
A
R
(y)
(s)
(y)
X
Y
1
Y
2

i=g( f(X.x, ?? ), Y
1
.y )
i=g(g(f(X.x, ?? ), Y
1
.y), Y
2
.y)
R
R
(x)
i=f(X.x, ?? ) (s)
(s)
(s=i)
(i=0)
63
C2. Problema de la Factorizacin
Reglas Reglas semnticas
(sean operadores asociativos por la derecha)
E T + E
1
E.val = T.val + E
1
.val
E T - E
1
E.val = T.val - E
1
.val
E T E.val = T.val
T ( E ) T.val = E.val
T num T.val = num.val
64
Esquema de traduccin top-down
Reglas + Acciones
E T + E
1
{ E.val = T.val + E
1
.val }
E T - E
1
{ E.val = T.val - E
1
.val }
E T { E.val = T.val }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
Si factorizamos, el resultado es el siguiente:
65
Esquema de traduccin resultante de la
factorizacin
Reglas + Acciones
E T R
R + E
1
{ E.val = T.val + E
1
.val }
R - E
1
{ E.val = T.val - E
1
.val }
R { E.val = T.val }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
El esquema no es vlido. Por tanto, primero se debe
factorizar, y posteriormente redefinir los atributos.
66
Factorizacin y nuevas reglas semnticas
Reglas Reglas semnticas
E T R E.val = T.val + R.val
R + E R.val = + E.val
R - E R.val = - E.val
R R.val = 0
T ( E ) T.val = E.val
T num T.val = num.val
67
Esquema de traduccin
Reglas + Acciones
E T R { E.val = T.val + R.val }
R + E { R.val = + E.val }
R - E { R.val = - E.val }
R { R.val = 0 }
T ( E ) { T.val = E.val }
T num { T.val = num.val }
68
Ejemplo grfico
E
T R
-
E
T R
+
E
T R

3

5
+
2
( 0 )
( 2 )
( 2 )
( 2 )
( 5 )
( 7 )
( 7 ) ( 3 )
( 4 )
69
Ejercicio
Reglas Reglas semnticas
L E L.s = E.val * E.n
E T + E
1
E.val = T.val + E
1
.val
E.n = E
1
.n + 1
E T - E
1
E.val = T.val - E
1
.val
E.n = E
1
.n + 1
E T E.val = T.val
E.n = 1
T ( E ) T.val = E.val
T num T.val = num.val
Obtener un esquema de traduccin top-down para esta definicin
dirigida por sintaxis.

Potrebbero piacerti anche