Вы находитесь на странице: 1из 18

Tema 5: Traduccin dirigida por la sintaxis

Procesamiento de Lenguajes

Dept. de Lenguajes y Sistemas Informticos


Universidad de Alicante

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 1 / 35

Ejemplo 1 de traduccin

suma(a,mul(4,b))
E
E E + T
E T
T T * F
T F E a + mul(4,b)
T
F id
F num T a
T 4 * F b
F pari E pard
a
F 4 b
F id
a+4*b a
id 4
num
suma(a,mul(4,b))

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 2 / 35


Ejemplo 1 de traduccin (2)

G RAMTICA DE ATRIBUTOS

R EGLA ACCIN SEMNTICA


E E + T E.trad := suma(||E1 .trad||, ||T.trad||)
E T E.trad := T.trad
T T * F T.trad := mul(||T1 .trad||, ||F.trad||)
T F T.trad := F.trad
F id F.trad := id.lexema
F num F.trad := num.lexema
F pari E pard F.trad := E.trad

IMPORTANTE: no es posible acceder a atributos de smbolos que no


estn en la regla

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 3 / 35

Ejemplo 2 de traduccin

a,b:integer
D
D T id L
T float
T int
L coma id L a
L  T
integer
id L
,b

int
coma id b L
int a,b

a,b:integer

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 4 / 35


Ejemplo 2 de traduccin (2)

G RAMTICA DE ATRIBUTOS
R EGLA ACCIN SEMNTICA
D T id L D.trad := id.lexema||L.trad|| : ||T.trad
T float T.trad := real
T int T.trad := integer
L coma id L L.trad := , ||id.lexema||L1 .trad
L  L.trad :=

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 5 / 35

Implementacin del traductor

Existen dos posibilidades:


1 El analizador sintctico construye el rbol (decorado con los
atributos de los terminales), y en una segunda pasada se recorre
el rbol calculando los atributos que falten hasta completar la
traduccin (traduccin de dos o ms pasadas)
2 El analizador sintctico no construye explcitamente el rbol
(aunque hace un recorrido virtual por el rbol), y va calculando
todos los atributos a la vez que va recorriendo el rbol (traduccin
de una sola pasada)

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 6 / 35


Recorrido virtual del rbol realizado por el A.S.

E 13

E E + T
E T E 4
+ 5 T 12
T T * F
T F T 3
F id T 8 * 9 F 11

F num F 2
F pari E pard F 7 id 10

id 1
num 6

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 7 / 35

Ejemplo 3 de traduccin

a:integer;b:integer
D
D T id L
T float
T int
L coma id L integer
id a integer
T L
L  ;b:integer

int
int a,b coma id b integer
L

a:integer;b:integer


Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 8 / 35


Ejemplo 3 de traduccin (2)

G RAMTICA DE ATRIBUTOS
R EGLA ACCIN SEMNTICA
D T id L L.th := T.trad;
D.trad := id.lexema|| : ||T.trad||L.trad
T float T.trad := real
T int T.trad := integer
L coma id L L1 .th := L.th;
L.trad := ; ||id.lexema|| : ||L.th||L1 .trad
L  L.trad :=

Algunos no terminales tienen ms de un atributo


Algunos atributos se calculan a partir de atributos de hermanos o
padres en el rbol. Estos atributos se llaman atributos heredados
(los dems atributos se llaman sintetizados).

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 9 / 35

Grafo de dependencias

a:integer;b:integer
D

T
integer
id a
L
integer

;b:integer

int
coma id b integer
L

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 10 / 35


Ejemplo 4 de traduccin

int a;int b
D
D L T
T real
int int
T integer L T
L L coma id int a;int b

L id integer
int coma id b
L
int a
a,b integer
a
int a;int b id

IMPORTANTE: hay herencia de derecha a izquierda en el rbol

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 11 / 35

Ejemplo 4 de traduccin (2)


G RAMTICA DE ATRIBUTOS
R EGLA ACCIN SEMNTICA
D L T L.th := T.trad; D.trad := L.trad
T real T.trad := double
T integer T.trad := int
L L coma id L1 .th := L.th;
L.trad := L1 .trad||; ||L.th||||id.lexema
L id L.trad := L.th||||id.lexema

La herencia de derecha (T ) a izquierda (L) implica que cuando se


est analizando/traduciendo L todava no se conoce la traduccin
de T
Por tanto, no es posible traducir a la vez que se analiza, no es
posible la traduccin en una pasada.
El analizador tiene que construir explcitamente el rbol, y cuando
termine, en una segunda pasada, podr generar la traduccin.
Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 12 / 35
Gramtica de atributos por la izquierda

D EFINICIN : una gramtica de atributos se dice que es una gramtica


de atributos por la izquierda (l-attributed grammar) si solamente hay
herencia de padres a hijos o bien de izquierda a derecha en el rbol,
pero no de derecha a izquierda
Las gramticas de atributos por la izquierda (GAI) son aquellas
que permiten evaluar los atributos a la vez que se hace el anlisis
sintctico (en una sola pasada).
Cuando la gramtica de atributos no cumple las condiciones de
las GAI (porque tiene herencia de derecha a izquierda en el
rbol), el analizador sintctico debe construir un rbol decorado
con atributos y, en una segunda pasada se evaluarn los atributos
que no se hayan podido evaluar en la primera pasada.

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 13 / 35

Tabla de smbolos

La tabla de smbolos se utiliza para almacenar los smbolos


(identificadores) declarados en el programa fuente, junto con su tipo y
posiblemente alguna informacin ms (direccin de memoria, etc).
Ejemplo:

N OMBRE T IPO D IRECCIN


a ENTERO 0
int a,b; b ENTERO 2
float c,d; c REAL 4
d REAL 8

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 14 / 35


Tabla de smbolos (2)

Cuando el compilador procesa las declaraciones, tiene que aadir


las variables declaradas a la tabla de smbolos (comprobando que
no se declara dos veces el mismo identificador en el mismo
mbito).
En el cdigo (instrucciones, expresiones, etc), cuando aparece un
identificador el compilador debe buscarlo en la tabla de smbolos,
y obtener sus datos: tipo, direccin, etc.

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 15 / 35

Ejemplo 5 de traduccin
En este ejemplo, el traductor no genera traduccin, pero debe
almacenar los smbolos en la tabla de smbolos:
N OMBRE T IPO D IRECCIN
a ENTERO 0
int a,b,c b ENTERO 2
c ENTERO 4

D EFINICIN DIRIGIDA POR LA SINTAXIS


R EGLA ACCIN SEMNTICA
D T id L L.th := T.tipo; anadirTS(id.lexema, T.tipo)
T float T.tipo := REAL
T int T.tipo := ENTERO
L coma id L L1 .th := L.th; anadirTS(id.lexema, L.th)
L 

Cuando una gramtica de atributos tiene acciones que no calculan


atributos, se denomina Definicin dirigida por la sintaxis (DDS)
Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 16 / 35
Definiciones dirigidas por la sintaxis (DDS)

Las DDS son como las gramticas de atributos, pero pueden


incluir acciones que no calculen atributos, con efectos
secundarios (como guardar smbolos en la tabla de smbolos), por
lo que todas las gramticas de atributos son tambin DDS
De igual manera que existen las gramticas de atributos por la
izquierda (GAI), existen tambin las definiciones dirigidas por la
sintaxis con atributos por la izquierda (DDSI), que son las que
permiten la traduccin en una sola pasada.
IMPORTANTE: las DDS solamente especifican las acciones que
es necesario realizar en cada regla, pero no el orden en el que
hay que ejecutarlas. Las DDS son una herramienta para el diseo
de alto nivel del traductor, sin entrar en los detalles de
implementacin. El orden de ejecucin de las acciones es muy
importante

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 17 / 35

Restricciones formales de las acciones semnticas


Dada una regla A , y una accin semntica b := f (c1 , c2 , . . . , cn ),
en una gramtica de atributos o en una DDS (o en un ETDS), se tiene
que cumplir una de las dos siguientes restricciones:
1 b es un atributo sintetizado de A, y c1 , c2 , . . . , cn son constantes o
atributos de los smbolos de la produccin (de A o de )
2 b es un atributo heredado de algn no terminal de , y
c1 , c2 , . . . , cn son constantes o atributos de los smbolos de la
produccin (de A o de )

Si b es un atributo heredado de un no terminal i , y se cumple que


c1 , c2 , . . . , cn son atributos de A o de otros smbolos j , con j < i,
entonces la gramtica de atributos o DDS cumple la condicin para ser
una GAI o DDSI (si se cumple tambin en las dems acciones
semnticas, por supuesto).

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 18 / 35


Ejemplo 5 de traduccin (2)

N OMBRE T IPO D IRECCIN


a ENTERO 0
int a,b,c b ENTERO 2
c ENTERO 4

E SQUEMA DE TRADUCCIN DIRIGIDO POR LA SINTAXIS (ETDS)


D T id {anadirTS(id.lexema, T.tipo); L.th := T.tipo}L
T float {T.tipo := REAL}
T int {T.tipo := ENTERO}
L coma id {anadirTS(id.lexema, L.th); L1 .th := L.th}L
L 

Un esquema de traduccin dirigido por la sintaxis (ETDS) es como


una DDSI en la que las acciones semnticas se insertan en la parte
derecha de la regla, en el momento exacto del anlisis en el que se
tienen que ejecutar.

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 19 / 35

Esquema de traduccin dirigido por la sintaxis (ETDS)

Los ETDS son la herramienta para disear traductores de una


sola pasada
Las acciones semnticas se situan (encerradas entre llaves) en el
punto de la parte derecha de la regla en que se deben ejecutar.
Se tienen que cumplir las siguientes restricciones:
1 Un atributo heredado de un smbolo i de la parte derecha de la
regla se debe calcular en una accin semntica situada antes de i
2 Una accin semntica no puede referirse a un atributo sintetizado
de un smbolo situado a la derecha de la accin en la regla
3 Un atributo sintetizado de la parte izquierda de la regla A solo se
puede calcular despus de haber calculado todos los atributos que
se usan para calcularlo (preferentemente al final de la regla).

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 20 / 35


Ejemplo 3 de traduccin, con ETDS

G RAMTICA DE ATRIBUTOS
R EGLA ACCIN SEMNTICA
D T id L L.th := T.trad; D.trad := id.lexema|| : ||T.trad||L.trad
T float T.trad := real
T int T.trad := integer
L coma id L L1 .th := L.th; L.trad := ; ||id.lexema|| : ||L.th||L1 .trad
L  L.trad :=

E SQUEMA DE TRADUCCIN DIRIGIDO POR LA SINTAXIS


D T id {L.th := T.trad}L {D.trad := id.lexema|| : ||T.trad||L.trad}
T float {T.trad := real}
T int {T.trad := integer }
L coma id {L1 .th := L.th}L {L.trad := ; ||id.lexema|| : ||L.th||L1 .trad}
L  {L.trad := }

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 21 / 35

Implementacin de ETDS

1 Con un analizador ascendente: hay que utilizar marcadores para


implementar las acciones en mitad de la parte derecha (ver libro
de A. Garrido et al., pp. 130 y siguientes), incluso con yacc.
2 Con un analizador descendente recursivo:
I Los atributos sintetizados deben ser devueltos por las funciones de
los no terminales (cuando hay ms de un atributo es mejor devolver
un struct o un objeto con todos los atributos de los no terminales)
I Los atributos heredados son parmetros que se les pasan a las
funciones de los no terminales
I IMPORTANTE: es necesario almacenar el lexema de los tokens
antes de llamar a la funcin empareja.
I La traduccin de la cadena de entrada es devuelta por la funcin
que analiza el smbolo inicial de la gramtica.

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 22 / 35


Implementacin de ETDS (2)

Ejemplo 3 de traduccin, implementado con un ASDR:


String L(String th) // L -> coma id L | epsilon
{
if (token == COMA)
String D() // D -> T id L {
{ String idlexema,ltrad;
String ttrad,idlexema,ltrad;
emparejar(COMA);
ttrad = T(); idlexema = lexema;
idlexema = lexema; emparejar(ID);
empareja(ID); ltrad = L(th); // L1.th := L.th
ltrad = L(ttrad); // L.th := T.trad return ";" + idlexema + ":" + th + ltrad;
}
return idlexema + ":" + ttrad + ltrad; else if (token == FINFICHERO)
} return ""; // L -> epsilon { L.trad := "" }
else
errorSintactico(....);
}

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 23 / 35

Traduccin de expresiones aritmticas con ETDS

a+b-c+d sum(res(sum(a,b),c),d)
a+b-c res(sum(a,b),c)

La asociatividad por la izquierda de los operadores + y - implica


utilizar una gramtica con recursividad por la izquierda:
E E op T
E T
T id
T ( E )

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 24 / 35


Traduccin de expresiones aritmticas con ETDS (2)

res(sum(a,b),c)
E

-
E E op T E
sum(a,b) op T c

E T
T id id c
a +
T ( E ) E op T b

a
T id b
a+b-c
res(sum(a,b),c) a
id

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 25 / 35

Traduccin de expresiones aritmticas con ETDS (3)

El ETDS quedara de esta manera:

E E op T {E.trad := op.trad||(||E1 .trad||, ||T.trad||)}


E T {E.trad := T.trad}
T id {T.trad := id.lexema}
T ( E ) {T.trad := E.trad}

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 26 / 35


Traduccin de expresiones aritmticas con ETDS (4)

Si queremos realizar la misma traduccin con una gramtica sin


recursividad por la izquierda (porque por ejemplo queremos usar un
ASDR), la gramtica sera:
E T E
E op T E
E 
T id
T ( E )

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 27 / 35

Traduccin de expresiones aritmticas con ETDS (5)


res(sum(a,b),c)
E

a a
T E
res(sum(a,b),c)

a
id
E T E
E op T E
E  op + b sum(a,b)
T id
T E
res(sum(a,b),c)
T ( E )
b
id
-
a+b-c op T c res(sum(a,b),c)
res(sum(a,b),c) E
res(sum(a,b),c)
c
id

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 28 / 35
Traduccin de expresiones aritmticas con ETDS (6)

El ETDS quedara:
E T {E.th := T.trad}E {E.trad := E.trad}
E op T {E10 .th := op.trad||(||E 0 .th||, ||T.trad||)}
E {E.trad := E10 .trad}
E  {E.trad := E.th}
T id {T.trad := id.lexema}
T ( E ) {T.trad := E.trad}

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 29 / 35

Ejercicio 1 (examen febrero 1998) (1 de 2)

Disea un ETDS para traducir declaraciones de funciones en C a


Pascal. El proceso de traduccin se puede especificar con los
siguientes ejemplos de traduccin:
int f(void), function f:integer;
g(float a,int *b); function g(a:real;var b:integer):integer;

void h(int a,float *c), procedure h(a:integer;var c:real);


j(void); procedure j;

float f(int a); function f(a:integer):real;

int f(int a,int b,int c), function f(a:integer;b:integer;c:integer):integer;


g(int d), function g(d:integer):integer;
h(int e); function h(e:integer):integer;

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 30 / 35


Ejercicio 1 (examen febrero 1998) (2 de 2)
Debes disear el ETDS utilizando como base la siguiente gramtica,
que genera el lenguaje fuente:
S TipoFun L puntoycoma
TipoFun void
TipoFun int
TipoFun float
L F Lp
Lp coma F Lp
Lp 
F ident lpar A rpar
A void
A Argu M
M coma Argu M
M 
Argu Tipo ident
Argu Tipo asterisco ident
Tipo int
Tipo float

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 31 / 35

Ejercicio 2 (examen marzo 1997) (1 de 2)

Disea un ETDS para traducir declaraciones de funciones y


procedimientos anidados en Pascal a C. El proceso de traduccin se
puede especificar con los siguientes ejemplos de traduccin:
function f:integer; int f(); procedure p1; void p1();
codigo procedure p2; void p1_p2();
endfunc; codigo float p1_f1();
endproc; void p1_p3();
procedure p1; void p1(); function f1:real; void p1_p3_p4();
procedure p2; void p1_p2(); codigo
codigo endfunc;
endproc; procedure p3;
codigo procedure p4;
endproc; codigo
endproc;
codigo
endproc;
codigo
endproc;

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 32 / 35


Ejercicio 2 (examen marzo 1997) (2 de 2)

Debes disear el ETDS utilizando como base la siguiente gramtica,


que genera el lenguaje fuente:

S P
P procedure id ; L endproc ;
P function id : T ; L endfunc ;
L P L
L codigo
T integer
T real

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 33 / 35

Ejercicio 3 (1 de 2)
Dada la siguiente gramtica (que permite declarar clases anidadas y
sus mtodos para un determinado lenguaje orientado a objetos):
S C
C class id { B V }
B public : P
B 
V private : P
V 
P D P
P 
D T id ( T id L )
D C
L , T id L
L 
T int
T float

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 34 / 35


Ejercicio 3 (2 de 2)

Construye un ETDS que traduzca a una notacin como la indicada en


este ejemplo:
class A { clase A {
public: pblico:
int f1(int n,float s) A::f1 (entero x real -> entero)
private: privado:
class B { clase A::B {
private: privado:
float f2 (float r,float s,float t) A::B::f2 (real x real x real -> real)
class C {} clase A::B::C {}
} }
} }

Procesamiento de Lenguajes Tema 5: Traduccin dirigida por la sintaxis 35 / 35

Вам также может понравиться