Академический Документы
Профессиональный Документы
Культура Документы
&x
y
1
cond
Ejemplo 1:
x:=y+1 x:=y+1
Codigo P
lda lda x // x // carga carga direccion direccion x x
lod lod y // y // carga carga valor y valor y
ldc ldc 1 // 1 // carga carga constante constante 1 1
adi adi // // suma suma 2 pos 2 pos pila pila
sto sto // // almacena almacena tope en inf. tope en inf.
&x
3
Generacin de cdigo. Procesadores de
Lenguaje I
rboles de Sintaxis Abstracta
Son rboles de derivacin en los que no existe
informacin superflua
Cada nodo hoja representa un operando y cada no-
hoja un operador
Ejemplos
rbol ASA S:=A+B*C IF A<B THEN X:=B A[I]:=B
E
E
T
F
A
T
F
B
+
+
A B
:=
S +
A *
B C
IF
< :=
A B X B
:=
[ ] B
A I
6
Generacin de cdigo. Procesadores de
Lenguaje I
Cdigos de Tres Direcciones
Sentencias del estilo x = y op z
Cada lnea de cdigo tiene un operador y hasta
tres direcciones
Es una representacin lineal del ASA
Uso generoso de variable temporales
Directamente relacionado con evaluacin de
expresiones
Ejemplo: a = b*(c+d) se traduce a:
tmp1 = c+d
tmp2 = b*tmp1
a = tmp2
Generacin de cdigo. Procesadores de
Lenguaje I
Cdigos de Tres Direcciones
Ejemplos (relacionar con ASA)
Ejemplo 1:
a=b*-c+4
Codigo 3 direcciones
t1=-c
t2=b*t1
t3=4
t4=t3+t2
a=t4
Ejemplo 2:
if if cond cond then then then_statements then_statements
else else
else_statements else_statements; ;
end if end if; ;
Codigo 3 direcciones
t1 = t1 = cond cond
iff iff t1 t1 else_label else_label
codigo codigo para para then_statements then_statements
goto goto endif_label endif_label
else_label else_label: :
codigo codigo para para else_statements else_statements
endif_label endif_label: :
7
Generacin de cdigo. Procesadores de
Lenguaje I
Instrucciones en Cdigo 3
direcciones
Asignaciones: x:=y op z (op aritmtico o lgico)
Asignaciones 1 argumento x:= op y
Copia x:=y
Salto incondicional: goto L (L etiqueta)
Salto condicional gotoc x L frecuente.: iff x L (if false)
Salto condicional if x relop y goto L
Etiquetas: label L
Llamada a subrutina:
param x1
...
param xn
call p,n
ret
Asignaciones indexadas
x:=y[i]
x[i]=y
Asignaciones con punteros
x:=&y, x:=*y, *x:=y
Generacin de cdigo. Procesadores de
Lenguaje I
Cdigos de 3 direcciones
Cada lnea de cdigo tiene un operador y hasta tres direcciones
Tipos: Cuartetos, Tercetos, Tercetos Indirectos
Cuartetos
Se representan por cuatro valores:
(<OPERADOR>,<Operando
1
>,<Operando
2
>,<Resultado>)
Ejemplos
Expresin Cuartetos Otra representacin
S:=A+B*C * B C T
1
(*, B, C, T
1
)
+ A T
1
T
2
(+, A, T
1
, T
2
)
:= T
2
S (:=,T
2
, , S )
IF A<B THEN X:=B < A B E
1
(<, A, B, E
1
)
IFF E
1
E
2
(IFF, E
1
, , E
2
)
:= B X (:=, B, , X )
LABEL E
2
(LABEL, , , E
2
)
8
Generacin de cdigo. Procesadores de
Lenguaje I
Implementacin de cdigo 3
direcciones
Implementacin con cuartetos
4 campos: (op,y,z,x) para x=y op z
Campos se anulan si no se necesitan, ej.: (rd,x,,)
Implementacin con tercetos
El cuarto elemento siempre es un temporal
En lugar de nombrarlo, utilizar el propio ndice del
terceto
Ejemplo: a = b+(c*d)
[cuartetos] [tercetos]
1. (mul,c,d,t1) 1: (mul,c,d)
2. (add,b,t1,t2) 2: (add,b,(1))
3. (:=,a,t2,_) 3: (:=,a,(2))
Generacin de cdigo. Procesadores de
Lenguaje I
Tercetos
Los cuartetos son la herramienta ms general
Inconvenientes
Ocupan demasiado espacio
Requieren muchas variables auxiliares para
almacenar los resultados intermedios
Los tercetos resuelven este problema
suprimiendo el operando del resultado, queda
implcito y asociado a dicho terceto
(<OPERADOR>, <Operando
1
>, <Operando
2
>)
Hacen referencia a otro terceto
Son equivalentes a rboles de Sintaxis Abstracta
9
Generacin de cdigo. Procesadores de
Lenguaje I
Tercetos y Tercetos Indirectos
Ejemplos
Expresin Tercetos
S:=A+B*C 1 (*, B, C)
2 (+, A, (1))
3 (:=, 2, S)
IF A<B THEN X:=B 1 (<, A, B)
2 (IFF,(1),(4))
3 (:=, B, X)
4 (,,)
Los Tercetos Indirectos son anlogos a los anteriores
pero en lugar de ejecutarse secuencialmente se ejecutan
segn un vector llamado SECUENCIA
Son ms fciles de optimizar
Ocupan menos memoria, el mismo terceto aparece una vez
Generacin de cdigo. Procesadores de
Lenguaje I
Tercetos Indirectos, Ejemplos
Expresin Tercetos Ind.
S:=A+B*C 1 (*, B, C)
X:=A+B*C 2 (+, A, (1))
3 (:=, (2), S)
4 (:=, (2), X)
VE=(1, 2, 3, 1, 2, 4)
WHILE X<B DO X:=X+1 1 (<, X, B)
2 (gotoc, (1), (4))
3 (goto, , (7))
4 (+, X, 1)
5 (:=, (4), X)
6 (goto, , (1))
7 (, , )
VE=(1, (2, 3, 4, 5, 6)+, 7)
10
Generacin de cdigo. Procesadores de
Lenguaje I
Generacin de Cdigo Intermedio:
Declaraciones
Definicin de atributos con CI (sintetizado) + acciones
semnticas
Construccin explcita de la tabla de smbolos
Se crean entradas para cada variable segn su tipo
Reserva de espacio en funcin del tipo empleado
offset es una variable global con direccin de la tabla actual
T.tipo, T.ancho: atributos que caracterizan cada entrada en
la tabla
Simplificacin: tabla de un solo procedimiento
Extensiones para declaraciones en procedimientos y
mbitos anidados
Generacin de cdigo. Procesadores de
Lenguaje I
Declaraciones (1 procedimiento)
Producciones Reglas semnticas
P {offset=0}
D
DD; D
Did: T {ponerTabla(id.lex, T.tipo, offset)
offset=offset+T.ancho}
Tinteger {T.tipo=integer
T.ancho=4}
Treal {T.tipo=real
T.ancho=8}
Tarray[num]
of T {T
0
.tipo=array(num.lex, T
1
.tipo)
T
0
.ancho=num.lex*T
1
.ancho}
TT {T
0
.tipo=pointer(T
1
.tipo)
T
0
.ancho=4}
11
Generacin de cdigo. Procesadores de
Lenguaje I
Tercetos para Expresiones
Se construyen nombres temporales para los nodos interiores del
rbol sintctico
Se calcula el valor del no terminal E en el lado izquierdo de EE+E
dentro de un nuevo temporal t: E
1
a t
1
; E
2
a t
2
; t= t
1
+t
2
E.lugar, es el nombre que contendr el valor de E (lugar en TS)
E.cdigo, es la secuencia instrucciones de tres direcciones para E
La funcin tempnuevo() devuelve una secuencia de nombres distintos
t
1
, t
2
, , t
3
,... en sucesivas llamadas
Las variables tienen el nombre id.lex, y se accede a su declaracin en
la tabla de smbolos como lookup(id.lex) (detectar errores)
gen(.) genera cdigo de tres direcciones
El nmero de temporales podra optimizarse posteriormente
Generacin de cdigo. Procesadores de
Lenguaje I
Asignaciones y Aritmtica
Producciones Regla Semntica
S id := E {p=lookup(id.lex);
if (p!=null) S.cdigo := E.cdigo || gen(p := E.lugar)}
E E+E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||
gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)}
E E*E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||
gen(E.lugar := E
1
.lugar * E
2
.lugar)}
E -E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || gen(E
0
.lugar:=menosu E
1
.lugar)}
E (E) {E
0
.lugar := E
1
.lugar;
E
0
.cdigo := E
1
.cdigo}
E id {p=lookup(id.lex), if (p!=null) E.lugar := p;}
12
Generacin de cdigo. Procesadores de
Lenguaje I
Conversiones de Tipos
Producciones Regla Semntica
S id := E {p=lookup(id.lex);
S.cdigo := E.cdigo || gen(p := E.lugar)}
E E+E {E
0
.lugar := tempnuevo();
if (E
1
.tipo=integer and E
2
.tipo=integer) then
c=gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)
E
0
.tipo=int
if (E
1
.tipo=real and E
2
.tipo=real) then
c=gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)
E
0
.tipo=real
if (E
1
.tipo=integerl and E
2
.tipo=real) then
c=gen(E
0
.lugar :=inttoreal E
1
.lugar + E
2
.lugar)
E
0
.tipo=real
if (E
1
.tipo=real and E
2
.tipo=integer) then
c=gen(E
0
.lugar :=l E
1
.lugar + inttoreal E
2
.lugar)
E
0
.tipo=real}
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||c
.
Ej.: x:=y+i*j
t
1
:=multi(i,j)
t
3
:=inttoreal t
1
t
2
:=addr(y, t
3
)
x:=t
2
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Declaraciones y
Expresiones
Ej.: a: int; c: real;
a=0;c=a*4.0+1;
P
Cdigo
Intermedio:
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4.0
t
4
:= t
3
+1
c:=t
4
Ds
id
(a)
Ds D
Ds D
T
(int)
id
(c)
T
(real)
Ss
S Ss
S Ss
id
(a)
E
(0)
:
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)
:
100
entero
a
104
real
c
TS
;
13
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Declaraciones y
Expresiones
Con atributo cdigo: concatenar atributos sintetizados
a: int; c: real;
a=0;c=a*4.0+1;
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
4
Ss
S Ss
S Ss
id
(a)
E
(0)
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
4
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Declaraciones y
Expresiones
Sin atributo cdigo: escribir cdigo globalmente
a: int; c: real;
a=0;c=a*4.0+1;
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
4
Ss
S Ss
S Ss
id
(a)
E
(0)
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)
t
1
:=0
a:=t
1
t
4
:= t
3
+1
t
2
:=inttoreal a
t
3
:= t
2
*4
c:=t
4
Salida global
14
Generacin de cdigo. Procesadores de
Lenguaje I
CGI sin utilizar atributo cdigo
Producciones Regla Semntica
S id := E {p=lookup(id.lex);
if (p!=null) emitir(p := E.lugar)}
E E+E {E
0
.lugar := tempnuevo();
emitir(E
0
.lugar := E
1
.lugar + E
2
.lugar)}
E E*E {E
0
.lugar := tempnuevo;
emitir(E
0
.lugar := E
1
.lugar * E
2
.lugar)}
E -E {E
0
.lugar := tempnuevo();
emitir(E
0
.lugar:=menosu E
1
.lugar)}
E (E) {E
0
.lugar := E
1
.lugar;}
E id {p=lookup(id.lex), if (p!=null) E.lugar := p;}
Generacin de cdigo. Procesadores de
Lenguaje I
Literales numricos
Dos posibilidades:
estricta (lugar es una direccin de memoria)
lugar es un texto
Producciones Regla Semntica
a) E num {E.lugar := nuevatemp(); emitir(E.lugar := num.lex)}
b) E num {E.lugar := num.lex)}
a=3+b+7+c
tmp1=3
tmp2=tmp1+b
tmp3=7
tmp4=tmp2+tmp3
tmp5=tmp4+c
a=tmp5
tmp1=3+b
tmp2=tmp1+7
tmp3=tmp2+c
a=tmp3
15
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con Arrays (1D)
Suponiendo almacenamiento secuencial, las direcciones se calculan
desde la direccin base (direccin en memoria) con desp. lineal:
a[i+1]:: dir_base(a)+(i+1)*sizeof(a)
E
0
id [E
1
] {p=lookup(id.lex)
E
0
.lugar=tempnuevo()
t=tempnuevo()
gen(t = E
1
.lugar * size(p))
gen(E
0
.lugar =p[ t ] )
}
Sid [E
1
]=E
2
{p=lookup(id.lex)
t=tempnuevo()
gen(t = E
1
.lugar * size(p))
gen( p[ t ]= E
2
.lugar)
}
Tambin puede hacerse con indirecciones (punteros)
a=p[i] t1=&p;
t2=t1+i;
a=*t2
Ejemplo:
a[i+1]=a[j+2]+3;
t1=j+2
t2=t1*size(a)
t3=a[t2];
t4=t3+3
t5=i+1
t6=t5*size(a)
a[t6]=t4
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays (1D)
Sin atributo cdigo: escribir cdigo globalmente
a[i+1]=a[j+2]+3;
S
E E
E E
+
id
(a)
t
1
:=i+1
t
2
:=j+2
Salida global
[ ]
id
(i)
num
(1)
=
E
E E
+
id
(a)
[ ]
id
(j)
num
(2)
Ejemplo:
a[i+1]=a[j+2]+3;
t
1
:=i+1
t
2
:=j+2
t
3
:=t
2
*size(a)
t
4
:=a[t
3
]
t
5
:= t
1
*size(a)
a[t
5
]:=t
4
t
3
:=t
2
*size(a)
t
4
:=a[t
3
]
t
5
:= t
1
*size(a)
a[t
5
]:=t
4
16
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Registros
Los registros tienen campos con desplazamiento fijo
typedef struct cplx{
double real;
double imag;
};
cdigo 3 dir independiente: funcin offset (tipo,campo) en la TS
Eid . id {
E.lugar=tempnuevo();
t1=tempnuevo();
t2=tempnuevo();
gen(t1 =& id1.lex)
gen(t2 = t1 +offset( id1.lex ,id2.lex ));
gen(E.lugar =* t2);
}
Punteros tienen traduccin directa
i=*x;
*x=i;
cplx.imag
cplx.real
base de cplx
desplaz. campo imag
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Combinaciones de punteros y registros
cplx *c1, *c2;
c1 ->real=c2->imag;
Eid -> id {
E.lugar=tempnuevo();
t=tempnuevo();
gen(t = id1 +offset( id1.lex ,id2.lex ));
gen(E.lugar =* t);
}
cplx.imag
cplx.real
base de cplx
desplaz. campo imag
17
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Ejemplos
cplx *c1, *c2;
c1 ->real=c2->imag;
cplx.imag
cplx.real
base de cplx
desplaz. campo imag
Ejemplo:
num.real=num.imag;
t2=&num
t3=t1+offset(num,imag)
t1=*t1
t4=&num
t5=t4+offset(num,real)
*t5=t1
Ejemplo:
c1->real= c2-> num.imag;
t2=c1+offset(c1,imag)
t3=*t2
t4=c2+offset(c2,real)
*t4=t3
Generacin de cdigo. Procesadores de
Lenguaje I
Generalizacin a k dimensiones: A[i
1
][i
2
][i
k
]
posicion: base+((((i
1
*n
2
+i
2
)*n
3
+i
3
))*n
k
+i
k
)*w
Ecuacin recurrente:
e
1
=i
1
e
m
=e
m-1
*n
m
+i
m
Evaluacin de Arrays Multi-
dimensionales
Un array se accede como un bloque
de posiciones consecutivas. Si empieza
en 0:
posicion a[i]: base+i*w
Matriz 2 dimensiones (por filas): A[i
1
][i
2
]
posicion: base+(i
1
*n
2
+i
2
)*w
a[1]
a[0]
a[i]
base w
A[i
1
][i
2
] A[i
1
][0]
A[0][i
2
] A[0][0]
n
2
i
2
i
1
18
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays Multi-
dimensionales
E representa la evaluacin de una expresin, L el acceso a una
variable
L.offset es distinto de null si L es un acceso con desplazamiento (array
segn instruccin de cdigo intermedio)
L.lugar es la posicin de comienzo
El smbolo recurrente Lista efecta el clculo de posicin de los ndices
con la ecuacin recursiva:
Lista
0
::=Lista
1
, E
Lista.lugar almacena el valor e
m
Lista.ndim es la dimensin (Lista
0
.ndim= Lista
1
.ndim+1)
Al terminar el ltimo ndice hay que multiplicar por w
El tipo array mantiene sus propiedades, en la tabla de smbolos: id.lex
tiene asociada una direccin: Lista.array
Tamao total: ancho (Lista.array)
Lmite de una dimensin: limite(Lista.array, m)
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays Multi-
dimensionales
Producciones Regla Semntica
S L := E {if (L.offset == null) gen(L.lugar= E.lugar
else gen(L.lugar [ L.offset ]=E.lugar}
E L {if (L.offset == null) gen(E.lugar= L.lugar
else E.lugar=tempnuevo(); gen(E.lugar =L.lugar [ L.offset ])}
E num {E.lugar=tempnuevo(); gen(E.lugar = num.val)}
L id {p=lookup(id.lex), L.lugar := p, L.offset=null}
L Lista] {L.lugar= tempnuevo();
L.offset= tempnuevo();
gen(L.lugar := base(Lista.array) )
gen(L.offset = Lista.lugar * ancho (Lista.array))}
ListaLista][E {t= tempnuevo(), m=Lista
1
.ndim+1
gen(t = Lista
1
.lugar * limite(Lista
1
.array,m))
gen(t = t + E.lugar)
Lista
0
.array=Lista
1
.array
Lista
0
.lugar=t, Lista
0
.ndim=m}
Listaid [E {p=lookup(id.lex), Lista.array= p
Lista.lugar=E.lugar
Lista.ndim=1}
19
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays Multi-
dimensionales
Ej.: x:=M[3][1] (M de tipo array{[04]x[04],int})
S
1
:= L
1
E
1
[ Lista
2
E
3
num (1)
Lista
1
]
L
2
[ E
2
id
(M)
num (3)
id
(x)
]
base
limite(i)
ancho
celda
Cdigo
Intermedio:
t
1
:=3
t
2
:=1
t
3
:=t
1
*5
t
3
:=t
3
+ t
2
t
4
:=base(M)
t
5
:=t
3
*4
t
6
:=t
4
[t
5
]
x:=t
6
Generacin de cdigo. Procesadores de
Lenguaje I
S
1
: /S
1
->L
1
=E
1
/
L
1
: L
1
.lugar=x /L
1
->id/
L
1
.offset=null
E
1
: /E
1
->L
2
/
L
2
: /L
2
->Lista
1
]/
Lista
1
: /Lista
1
->Lista
2
][E
3
/
Lista
2
: /Lista
2
->E
2
]/
E
2
: E
2
.lugar=t
1
/E
2
->num/
t
1
=3
Lista
2
.lugar=t
1
Lista
2
.ndim=1
Lista
2
.array=M
E
3
: E
3
.lugar=t
2
/E
3
->num/
t
2
=1
Lista
1
.lugar=t
3
m=2
t
3
= t
1
*5 (*lista
2
*limite(M,1)*)
t
3
= t
3
+t
2
(*suma indice E
3
*)
Lista
1
.array=M
Lista
1
.lugar=t
3
Lista
1
.ndim=m
L
2
.lugar= t
4
L
2
.offset=t
5
t
4
=base(M)
t
5
=t
3
*ancho(M) (*lista1*ancho*)
E
1
.lugar=t
6
t
6
=t
5
[t
5
]
x=t
6
t
1
:=3
t
2
:=1
t
3
:=t
1
*5
t
3
:=t
3
+ t
2
t
4
:=base(M)
t
5
:=t
3
*4
t
6
:=t
4
[t
5
]
x:=t
6
20
Generacin de cdigo. Procesadores de
Lenguaje I
GCI para Expresiones Booleanas
Dos posibilidades:
Valores numricos (0,1)
Etiquetas para control de flujo
Con valores numricos: E toma un valor aritmtico,
instrucciones de salto en funcin del valor
if (a<b) x=1
t1=a<b
iff t1 L1
x:=1
L1
Con etiquetas: una expresin booleana tiene directamente las
etiquetas, que son posiciones destino de control de flujo:
E.true, E.false (evaluacin en cortocircuito)
Son atributos heredados
if (a<b) x=1
if a < b goto L1
goto L2
L1 x:=1
L2
E, a<b, tiene un
atributo: t1
E, a<b, tiene tres
atributos: L1, L2, cdigo
Generacin de cdigo. Procesadores de
Lenguaje I
GCI para Expresiones Booleanas
Ejemplos:
if if E E then then S1 else S2 S1 else S2
Codigo 3 direcciones
C C digo digo de de evaluaci evaluaci n n de E de E
( (hacia hacia qu qu etiqueta etiqueta salto salto) )
E.true E.true: :
C C digo digo para para S1 S1
goto goto Seguir Seguir
E.false E.false: :
C C digo digo para para S2 S2
Seguir:
siguientes instrucciones
while while (E) S (E) S
Codigo 3 direcciones
Comienzo Comienzo: :
C C digo digo de de evaluaci evaluaci n n de E de E
( (hacia hacia qu qu etiqueta etiqueta salto salto) )
E.true E.true: :
C C digo digo para para S S
goto goto Comienzo Comienzo
E.false E.false: :
siguientes instrucciones
21
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
AND: E0 -> E1 || E2
true
false
E0
E2
E1
true
true
false
false
label E1.false:
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
AND: E0 -> E1 && E2
true
false
E0
E2
E1
true
true
false
false
label E1.true:
22
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
Produccin Regla Semntica
E:=true {E.codigo = gen (goto E.true)}
E:=false {E.codigo = gen (goto E.false)}
E:=id
1
relop id
2
{E.code=gen(if id
1
.lugar relop id
2
.lugar goto E.true)||
gen(goto E.false)}
E
0
:=E
1
or E
2
{E
1
.false= newlabel()
E
1
.true= E
0
.true
E
2
.true= E
0
.true
E
2
.false= E
0
.false
E
0
.codigo= E
1
.codigo || gen(E
1
.false :) || E
2
.codigo}
E
0
:=E
1
and E
2
{E
1
.true= newlabel()
E
1
.false= E
0
.false
E
2
.true= E
0
.true
E
2
.false= E
0
.false
E
0
.codigo= E
1
.codigo || gen(E
1
.true :) || E
2
.codigo}
E
0
:=(E
1
) {E
1
.false= E
0
.false
E
1
.true= E
0
.true
E
1
.code= E
0
.code}
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito. Ejemplo:
if (B) S:
codigo de B
Lt0:
cdigo de S
Lf0:
Ejemplo:
if (a<(b+32) || (b>0 && a>0))
x=1
t1=b+32
if a < t1 goto Lt0
if b > 0 goto L1
goto Lf0
Label L1:
if a > 0 goto Lt0
goto Lf0
Label Lt0
x=1
Labl Lf0
23
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Estructuras de control
CONDICIONAL: S-> if (B) S else S
E0
S2
B
true
false
S1
label S.next:
goto S.next:
label B.true:
label B.false:
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Estructuras de control
BUCLE: S-> while (B) do S
E0
B
true
false
S
label S.next:
goto inicio
label B.true:
label inicio:
24
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Sentencias Condicionales
Produccin Regla Semntica
S:=if E then S
1
{E.true= newlabel()
E.false= S
0
.next
S
1
.next= S
0
.next
S
0
.codigo=E.codigo||gen(E.true :)||S
1
.codigo}
S
0
:=if E then S
1
else S
2
{E.true= newlabel()
E.false= newlabel()
S
1
.next= S
0
.next
S
2
.next= S
0
.next
S
0
.codigo=E.codigo||gen(E.true :)||S
1
.codigo||
gen(goto S
0
.next||gen(E.false :)||S
2
.codigo}
S
0
:= while E do S
1
{begin = newlabel()
E.true= newlabel()
E.false= S
0
.next
S
1
.next= begin
S
0
.codigo=gen(begin :)||E.codigo|| gen(E.true :)||
S
1
.codigo||gen(goto begin)}
Atributo heredado S.next: instruccin continuacin
Problema: etiquetas desconocidas a priori (idem)
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condicionales sin atrib cdigo
Produccin Regla Semntica
S
0
:=if {E.true= newlabel(); E.false= S
0
.next}
E then {emitir(label E.true :); S
1
.next= S
0
.next;}
S
1
S
0
:=if {E.true= newlabel(); E.false= newlabel()}
E then {emitir(label E.true :); S
1
.next= S
0
.next}
S
1
else {emitir(label E.false :); S
2
.next= S
0
.next}
S
2
S
0
:= while {begin = newlabel(); E.true= newlabel();
E.false= S
0
.next; emitir(label begin :);}
E do {S
1
.next= begin; emitir(label E.true :); }
S
1
Atributo heredado S.next: instruccin continuacin
25
Generacin de cdigo. Procesadores de
Lenguaje I
Ejemplo control de flujo
while s<K do
if a>b
s=s+a
else
s=s-a
S
1
while E
1
E
2
S
2
do
if else S
4
S
3
> id
(a)
id
(b)
> id
(s)
id
(K)
Cdigo 3
direcciones
L
1
: if s<K goto L
2
goto L
0
L
2
: if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
goto L
1
L
0
:
Generacin de cdigo. Procesadores de
Lenguaje I
-
S
1
.next=L
0
(**)
S
1
: /S
1
->while E
1
do S
2
/
S
1
.next=L
0
begin=L
1
E
1
.true=L
2
E
1
.false=L
0
E
1
: /E
1
->id op id/
E
1
.codigo=if s<K goto L
2
goto L
0
S
2
.next=L
0
S
2
: /S
2
->if E
2
then S
3
else S
4
/
E
2
.true=L
3
E
2
.false=L
4
E
2
: /E
2
->id op id/
E
2
.codigo=if a>b goto L
3
goto L
4
goto L
0
S
3
.next=L
1
S
3
: /S
3
->s=s+a/
S
3
.codigo=t
1
=s+a
s=t
1
S
4
.next=L
0
S
4
: /S
4
->s=s-a/
S
4
.codigo=t
2
=s+a
s=t
2
S
2
.codigo=
S
1
.codigo=
if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
L
1
: if s<K goto L
2
goto L
0
L
2
: if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
goto L
1
L
0
:
26
Generacin de cdigo. Procesadores de
Lenguaje I
Relleno con retroceso (back-patching)
goto target
...
goto target
...
target: mov foobar,r1
Tabla
target
goto target
.
goto target
28
Generacin de cdigo. Procesadores de
Lenguaje I
Ejemplo con funciones y expresiones
Sin atributo cdigo: escribir cdigo globalmente
a=0;c=1+f(2,4*a);
t
1
:=0
a:=t
1
t
2
:=4*a
param t
2
param 1
t
3
=call f 2
t
4
:= 1+t
3
c:=t
4
S
id
(c)
E =
E
E
(1)
+
( lista id
(f)
t
2
:=4*a
c:=t
4
)
lista ,
E
E
(4)
* E
(a)
E
(1)
t
2
t
2
1
param t
2
param 1
t
3
=call f 2
t
4
=1+t
3