Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay...

69
1 Traducción dirigida por la sintaxis

Transcript of Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay...

Page 1: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

1

Traducción dirigida por la sintaxis

Page 2: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

2

INDICE

1. Gramáticas con atributos2. Evaluación de los atributos

2.1 Evaluación mediante grafos2.2 Evaluación durante el parsing

2.2.1 Esquemas de traducción2.2.2 Traducción top-down2.2.3 Traducción bottom-up

Page 3: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

3

1. Gramáticas con atributos

Cada símbolo de una gramática puede tener asociados uno o más atributos.

Los atributos pueden ser de cualquier tipo de dato, y su significado depende del programador (valor de una constante, valor de una expresión, puntero, etc…)

N A ‘t’ B C

Representación: N.n A.a ‘t’.t B.b C.c

Page 4: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

4

Tipos de atributos

1. Sintetizados2. Heredados

SintetizadosN A B CN.s = f ( A.a , B.b , C.c , N.i )

N.i : atributos que N hereda de su padre o sus hermanos

Page 5: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

5

Tipos de atributos

Heredados

N A B C

B.i = f (A.a , B.b , C.c , N.n)

Page 6: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

6

Especificación de atributos: reglas semánticas

Reglas Reglas semánticas

A B C D A.a = B.b + C.cD.i = B.b – C.c

C E F C.c = E.e * F.f

Reglas + Reglas semánticas =

Definición dirigida por sintaxis

Page 7: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

7

Ejemplo 1: definición dirigida por sintaxis

REGLAS REGLAS SEMÁNTICAS

L E ‘\n’ print (E.val)E E1 + T E.val = E1.val + T.valE T E.val = T.valT T1 * F T.val = T1.val * F.valT F T.val = F.valF ( E ) F.val = E.valF cte F.val = cte.val

Page 8: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

8

Ejemplo 1: árbol sintáctico ilustrativo

L

\nE

E + T

T

F

c te

3

T F

F

c te

5

cte

4

*

+ *

(v a l= 3 ) (v a l= 5 )

(v a l= 4 )(v a l= 3 )

(v a l= 3 )

(v a l= 3 )

(v a l= 5 )

(v a l= 5 ) (v a l= 4 )

(v a l= 2 0 )

(v a l= 2 3 )

p r in t (2 3 )

Page 9: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

9

Ejemplo 2: definición dirigida por sintaxis

REGLAS REGLAS SEMÁNTICAS

D T L L.i = T.typeT int T.type = 0T real T.type = 1L L1 , id L1.i = L.i

save(id.ptr , L.i)

L id save(id.ptr ,L.i)

Page 10: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

10

Ejemplo 2: árbol sintáctico ilustrativo

D

in t

i n t b ca ,

( t y p e = 0 )T L

L , id

L , id

,

id

( i = 0 )

( i = 0 )

( i = 0 )

Page 11: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

11

Ejemplo 3: definición dirigida por sintaxis

REGLAS REGLAS SEMÁNTICAS

E E1 + T E.ptr = makenode (+ , E1.ptr , T.ptr)E E1 – T E.ptr = makenode (- , E1.ptr , T.ptr)E T E.ptr = T.ptrT ( E ) T.ptr = E.ptrT id T.ptr = makeleaf (id , id.ptr)T cte T.ptr = makeleaf (cte , cte.valor)

Page 12: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

12

Ejemplo 3: árbol sintáctico ilustrativo

E

ba 5-

(p tr )

+

E + T

E - Tid

c teT

id

idc te 5id

(p tr )

(p tr )

(p tr )

(p tr )

(p tr )

+

-

a b

Page 13: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

13

ÍNDICE

1. Gramáticas con atributos2. Evaluación de los atributos

2.1 Evaluación mediante grafos2.2 Evaluación durante el parsing

2.2.1 Esquemas de traducción2.2.2 Traducción top-down2.2.3 Traducción bottom-up

Page 14: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

14

2. EVALUACIÓN DE LOS ATRIBUTOS

Una Definición dirigida por sintaxis especifica el valor de los atributos, pero no especifica la forma de evaluación.

Existen 2 tipos de métodos para la evaluación:

2.1 Evaluación mediante grafos: la evaluación es independiente del reconocimiento sintáctico (parsing).

2.2 Evaluación durante el parsing: la evaluación se produce durante el reconocimiento sintáctico.

Page 15: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

15

2.1 Evaluación mediante grafos

METODOLOGÍA

• 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.

Page 16: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

16

Ejemplo

REGLAS REGLAS SEMÁNTICAS

E E1 + E2 E.val = E1.val + E2.valE E1 * E2 E.val = E1.val * E2.valE ( E1 ) E.val = E1.valE - E1 E.val = - E1.valE cte E.val = cte.val

Page 17: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

17

Árbol sintáctico 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 sintácticoGrafo de dependencias

Page 18: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

18

Ventajas y desventajas

Ventaja importante

La evaluación mediante grafos es válida para cualquier definición dirigida por sintaxis (que no contenga ciclos)

Desventajas

Hay que construir un grafo que puede ser enorme (ESPACIO y TIEMPO) y la evaluación se realiza después de finalizar el análisis sintáctico (la evaluación durante el parsing es un poco más intuitiva)

Page 19: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

19

2.2 Evaluación durante el parsing

Se trata de evaluar los atributos durante el proceso de parsing.

Ventajas

No se precisa de grafo de dependencias, y la evaluación es un poco más intuitiva.

Desventaja principal

No es una metodología válida para todo tipo de definiciones dirigidas por sintaxis.

Page 20: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

20

2.2.1 Esquemas de traducción

Un esquema de traducción especifica la forma en que se van a evaluar los atributos durante un proceso de parsing.

Reglas sintácticas

+ } Definición dirigida por sintaxis

Reglas semánticas

Page 21: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

21

Esquemas de traducción

Reglas sintácticas

+ } Esquema de traducción

ACCIONES

N A { acción_1 } B C { acción_2 }

Page 22: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

22

Diseño del esquema de traducción

Dada una definición dirigida por sintaxis

¿ Cómo diseñamos el esquema de traducción ?

El diseño del esquema de traducción depende del tipo de recorrido que se realiza durante el proceso de parsing. Fundamentalmente tenemos 2 tipos de diseño:

2.2.2 Traducción top-down2.2.3 Traducción bottom-up

Page 23: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

23

2.2.2 Esquemas de traducción top-down

A. Diseño del esquema de traducción

B. Implementación del esquema de traducción

C. Soluciones para algunos problemas

Page 24: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

24

A. Diseño de esquemas de traducción 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)

Page 25: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

25

Metodología

1. El cálculo de un atributo sintetizado se realiza al final del procedimiento del no-terminal correspondiente.

2. El cálculo de un atributo heredado se realiza antes de la llamada al procedimiento del no-terminal correspondiente.

Page 26: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

26

Ejemplo 1 (I): definición dirigida por sintaxis

REGLAS REGLAS SEMÁNTICAS

E E1 + E2 E.val = E1.val + E2.valE E1 * E2 E.val = E1.val * E2.valE ( E1 ) E.val = E1.valE - E1 E.val = - E1.valE cte E.val = cte.val

Page 27: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

27

Ejemplo 1 (II): esquema de traducción top-down

REGLAS y ACCIONES

E E1 + E2 { E.val = E1.val + E2.val } A1E E1 * E2 { E.val = E1.val * E2.val } A2E ( E1 ) { E.val = E1.val } A3E - E1 { E.val = - E1.val } A4E cte { E.val = cte.val } A5

Page 28: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

28

Ejemplo 1 (III): árbol sintáctico con las acciones

E

E + E

E

-

cte

2

E E-

cte

3

cte

5

*

+ *

A1

A2A4

A5 A5 A5

Page 29: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

29

REGLAS REGLAS SEMÁNTICAS

D T L L.i = T.typeT int T.type = 0T real T.type = 1L L1 , id L1.i = L.i

save(id.ptr , L.i)

L id save(id.ptr ,L.i)

Ejemplo 2 (I): definición dirigida por sintaxis

Page 30: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

30

Ejemplo 2 (II): esquema de traducción top-down

REGLAS y ACCIONES

D T { L.i = T.type } L A1T int { T.type = 0 } A2T real { T.type = 1 } A3L { L1.i = L.i } L1 , id { save(id.ptr , L.i) } A4,A5L id { save(id.ptr ,L.i) } A6

Page 31: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

31

Ejemplo 2 (III): árbol sintáctico con las acciones

D

in t

i n t b ca ,

T L

L , id

L , id

,

id

A 1

A 2 A 5A 4

A 4 A 5

A 6

Page 32: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

32

Restricciones

¿ Se puede diseñar un esquema de traducción top-downpara cualquier definición dirigida por sintaxis ?

REGLAS REGLAS SEMÁNTICAS

N A B C B.i = f (C.s)B D F B.s = g (D.s, F.s, B.i)

No podemos diseñar un esquema de traducción top-down para esta definición dirigida por sintaxis.

Page 33: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

33

Clasificación de las definiciones dirigidas por sintaxis

S-Attributed

Solamente contienen atributos de tipo sintetizado.

L-AttributedContienen atributos sintetizados y heredados, pero éstos últimos tienen la siguiente restricción:

A X1 X2 … Xj

Xk.i = f (X1.x1, X2.x2, … , Xk-1.xk-1, A.i)

Page 34: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

34

Validez del esquema de traducción top-down

La metodología mostrada anteriormente para diseñar el esquema de traducción para reconocedores top-down

solamente es válida

para definiciones dirigidas por sintaxis que sean L-Attributed (por supuesto, están incluidas las definiciones S-Attributed)

Page 35: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

35

B. Implementación de esquemas de traducción top-down

Hay que modificar el parser top-down considerando:

1. Cada procedimiento recibe los atributos heredados a través de su lista de parámetros.

2. Las acciones correspondientes al cálculo 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.

Page 36: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

36

Ejemplo general

N { A1 } A { A2 } B { A3 } C { A4 }

Procedure N (Atributos que N hereda)

{ A1 } / Cálculo de atributos que A heredaA.s = A (Atributos que A hereda)

{ A2 } / Cálculo de atributos que B heredaB.s = B (Atributos que B hereda)

{ A3 } / Cálculo de atributos que C heredaC.s = C (Atributos que C hereda)

{ A4 } / Cálculo de atributos que N sintetizaN.s = f (A.a, B.b, C.c, N.i)

return (N.s)

Page 37: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

37

Ejemplo (I): definición dirigida por sintaxis

REGLAS REGLAS SEMÁNTICAS

D T L L.i = T.typeT int T.type = 0T real T.type = 1L L1 , id L1.i = L.i

save(id.ptr , L.i)

L id save(id.ptr ,L.i)

Page 38: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

38

Ejemplo (II): esquema de traducción top-down

REGLAS y ACCIONES

D T { L.i = T.type } LT int { T.type = 0 }T real { T.type = 1 }L { L1.i = L.i } L1 , id { save(id.ptr , L.i) }L id { save(id.ptr ,L.i) }

Page 39: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

39

Ejemplo (III): implementación del esquema de traducción

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 ();

Page 40: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

40

Ejemplo (III): implementación del esquema de traducción

Procedure L (L.i) OJO !! No podemos implementar L correctamente

Si aplicamos la regla: L L , id debido a la recursividad porla izquierda

{ L1.i = L.i; }L (L1.i);if (lookahead=‘,’) newlookahead else error ();if (lookahead=‘id’) newlookahead else error ();save (id.ptr, L.i);

Si aplicamos la regla: L id

if (lookahead=‘id’) newlookahead else error ();save (id.ptr, L.i);

Page 41: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

41

C. Soluciones para algunos problemas

Los esquemas de traducción top-down tienen problemas de implementación cuando aparecen 2 tipos de situaciones:

C1. Recursividad por la izquierda

C2. Factorización

Page 42: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

42

C1. Recursividad por la izquierda

Reglas + Acciones

E E1 + T { E.val = E1.val + T.val }E E1 - T { E.val = E1.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 quedaría el siguiente esquema:

Page 43: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

43

Problema al eliminar la recursividad por la izquierda

E T { E.val = T.val } RR + T { E.val = E1.val + T.val } R

| - T { E.val = E1.val - T.val } R| ε

T ( E ) { T.val = E.val }T num { T.val = num.val }

Page 44: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

44

Posible solución: recursividad por la derecha

Reglas + Acciones

E T + E1 { E.val = T.val + E1.val}E T - E1 { E.val = T.val - E1.val}E T { E.val = T.val }T ( E ) { T.val = E.val }T num { T.val = num.val }

Esta solución no es válida porque no conserva la asociatividad por la izquierda de los operadores.

Page 45: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

45

Asociatividad incorrecta: ilustración

E

T - E

num

3

T E

num

5

num

1

+

- +

T

(6)

(1)

(1)(5)

(5)

(-3)

(3)

(3)

Page 46: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

46

Una solución válida: cambiar las reglas semánticas

Reglas Reglas semánticas

E T R { R.i=T.val ; E.s=R.s }R + T R1 { R1.i=R.i + T.val ; R.s=R1.s }

| - T R1 { R1.i=R.i - T.val ; R.s=R1.s }| ε { R.s=R.i }

T ( E ) { T.val = E.val }T num { T.val = num.val }

Page 47: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

47

Esquema gráfico de los atributos

E

T

-

R

num

3

T

Rnum

5

num

1

R

- +

T (i) (s)

(i)

+

ε

(i)

(s)

(s)

(s)(val)

(val)

(val)

Page 48: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

48

Esquema de traducción resultante

Reglas + Acciones

E T { R.i=T.val } R { E.s=R.s }

R + T { R1.i=R.i + T.val } R1 { R.s=R1.s }

| - T { R1.i=R.i - T.val } R1 { R.s=R1.s }

| ε { R.s=R.i }

T ( E ) { T.val = E.val }

T num { T.val = num.val }

Page 49: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

49

Implementación del esquema

Se deja como práctica de laboratorio

Page 50: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

50

Generalización (para atributos sintetizados)

Sea la siguiente definición dirigida por sintaxis, y sea un atributo sintetizado “a” genérico:

A A1 Y A.a=g(A1.a, Y.y)A X A.a=f(X.x)

Para una derivación a izquierdas genérica tenemos:

A A Y2 A Y1 Y2 X Y1 Y2

A.a=g( g( f(X.x), Y1.y), Y2.y)

Page 51: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

51

Gráficamente

A

Y2(a)

(a)

(a)

A

A Y1

X

(y)

(y)

f(X.x)

g( f(X.x), Y1.y )

g( g(f(X.x), Y1.y), Y2.y)

Page 52: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

52

Solución para atributos sintetizados

Eliminar recursividad + redefinir las reglas semánticas

REGLAS REGLAS SEMÁNTICAS

A X R R.i=f(X.x); A.s=R.sR Y R1 R1.i=g(R.i,Y.y); R.s=R1.sR ε R.s=R.i

A continuación lo expresamos gráficamente

Page 53: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

53

Gráficamente

A

R

(y)

(s)

(y)

X

Y1

Y2

ε

i=g( f(X.x), Y1.y )

i=g( g(f(X.x), Y1.y), Y2.y)

R

R

(x) i=f(X.x) (s)

(s)

(s=i)

Page 54: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

54

Esquema de traducción

A X { R.i=f(X.x) }R { A.s=R.s }

R Y { R1.i=g(R.i, Y.y) }R1 { R.s=R1.s }

R ε { R.s=R.i }

Page 55: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

55

Generalización para atributos heredados por copia

Sea la siguiente definición dirigida por sintaxis, y sea un atributo heredado por copia “i” genérico:

A A1 Y A.a=g(A1.a, Y.y); A1.i=A.iA X A.a=f(X.x, A.i)

Para una derivación a izquierdas genérica tenemos:

A1 A2 Y2 A3 Y1 Y2 X Y1 Y2

A.a=g( g( f(X.x, A3.i), Y1.y), Y2.y)

Page 56: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

56

Gráficamente

A1

Y2(a)

(a)

(a)

A2

A3 Y1

X

(y)

(y)

f(X.x, A3.i=v)

g( f(X.x, v), Y1.y )

g( g(f(X.x, v), Y1.y), Y2.y)

(x)

(i)

(i)

(i=v)

Page 57: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

57

Solución para atributos heredados por copia

Eliminar recursividad + redefinir las reglas semánticas

REGLAS REGLAS SEMÁNTICAS

A X R R.i=f(X.x, A.i=v); A.s=R.sR Y R1 R1.i=g(R.i,Y.y); R.s=R1.sR ε R.s=R.i

A continuación lo expresamos gráficamente

Page 58: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

58

Gráficamente

A

R

(y)

(s)

(y)

X

Y1

Y2

ε

i=g( f(X.x,v), Y1.y )

i=g(g(f(X.x,v), Y1.y), Y2.y)

R

R

(x) i=f(X.x,v) (s)

(s)

(s=i)

(i=v)

Page 59: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

59

Generalización para atributos heredados genéricos

Sea la siguiente definición dirigida por sintaxis, y sea un atributo heredado genérico “i” :

A A1 Y A.a=g(A1.a, Y.y); A1.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 derivación a izquierdas genérica tenemos:

A1 A2 Y2 A3 Y1 Y2 X Y1 Y2

A.a=g( g( f(X.x, A3.i), Y1.y), Y2.y)

Page 60: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

60

Gráficamente

A

Y2(a)

(a)

(a)

A

A Y1

X

(y)

(y)

f(X.x, 2)

g( f(X.x, 2), Y1.y )

g( g(f(X.x, 2), Y1.y), Y2.y)

(x)

(i=2)

(i=1)

(i=0)

Page 61: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

61

Solución para atributos heredados genéricos

Eliminar recursividad + redefinir las reglas semánticas

REGLAS REGLAS SEMÁNTICAS

A X R R.i=f(X.x, ???? ); A.s=R.sR Y R1 R1.i=g(R.i,Y.y); R.s=R1.sR ε 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 cómputos 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 continuación lo expresamos gráficamente

Page 62: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

62

Gráficamente

A

R

(y)

(s)

(y)

X

Y1

Y2

ε

i=g( f(X.x, ?? ), Y1.y )

i=g(g(f(X.x, ?? ), Y1.y), Y2.y)

R

R

(x) i=f(X.x, ?? ) (s)

(s)

(s=i)

(i=0)

Page 63: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

63

C2. Problema de la Factorización

Reglas Reglas semánticas(sean operadores asociativos por la derecha)

E T + E1 E.val = T.val + E1.valE T - E1 E.val = T.val - E1.val E T E.val = T.val T ( E ) T.val = E.val T num T.val = num.val

Page 64: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

64

Esquema de traducción top-down

Reglas + Acciones

E T + E1 { E.val = T.val + E1.val }E T - E1 { E.val = T.val - E1.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:

Page 65: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

65

Esquema de traducción resultante de la factorización

Reglas + Acciones

E T RR + E1 { E.val = T.val + E1.val }R - E1 { E.val = T.val - E1.val }R ε { E.val = T.val }T ( E ) { T.val = E.val }T num { T.val = num.val }

El esquema no es válido. Por tanto, primero se debe factorizar, y posteriormente redefinir los atributos.

Page 66: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

66

Factorización y nuevas reglas semánticas

Reglas Reglas semánticas

E T R E.val = T.val + R.valR + E R.val = + E.val R - E R.val = - E.val R ε R.val = 0T ( E ) T.val = E.val T num T.val = num.val

Page 67: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

67

Esquema de traducción

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 }

Page 68: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

68

Ejemplo gráfico

E

T R

- E

T R

+ E

T R

ε

3 − 5 + 2

( 0 )( 2 )

( 2 )

( 2 )( 5 )

( 7 )

( − 7 )( 3 )

( − 4 )

Page 69: Traducción dirigida por la sintaxis · B. Implementación de esquemas de traducción top-down Hay que modificar el parser top-down considerando: 1. Cada procedimiento recibe los

69

Ejercicio

Reglas Reglas semánticas

L E L.s = E.val * E.nE T + E1 E.val = T.val + E1.val

E.n = E1.n + 1E T - E1 E.val = T.val - E1.val

E.n = E1.n + 1E T E.val = T.val

E.n = 1T ( E ) T.val = E.val T num T.val = num.val

Obtener un esquema de traducción top-down para esta definición dirigida por sintaxis.