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

Post on 15-Mar-2020

2 views 0 download

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

1

Traducción dirigida por la sintaxis

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

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

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

5

Tipos de atributos

Heredados

N A B C

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

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

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

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 )

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)

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 )

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)

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

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

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.

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.

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

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

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)

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.

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

21

Esquemas de traducción

Reglas sintácticas

+ } Esquema de traducción

ACCIONES

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

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

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

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)

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.

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

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

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

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

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

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

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.

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)

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)

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.

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)

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)

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) }

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

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

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

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:

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 }

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.

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)

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 }

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)

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 }

49

Implementación del esquema

Se deja como práctica de laboratorio

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)

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)

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

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)

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 }

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)

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)

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

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)

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)

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)

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

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)

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

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:

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.

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

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 }

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 )

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.