You are on page 1of 21

1

Bloque 3: Sntesis
TEMA 5:GENERACIN DE CDIGO
INTERMEDIO
ndice
1. Introduccin
1.1. Por qu escribir cdigo intermedio
2. Lenguajes intermedios
2.1. Representacin mediante rbol semntico
2.2. Representacin polaca inversa (RPN)
2.3. Representacin mediante cdigo de tres
direcciones
3. Traduccin de diferentes partes:
3.1. Declaraciones
3.2. Traduccin de proposicin de asignacin y expresiones
3.3. Traduccin de expresiones lgicas:
3.5. Traduccin de proposiciones de control
2
ndice
1. Introduccin
1.1. Por qu escribir cdigo intermedio
2. Lenguajes intermedios
2.1. Representacin mediante rbol semntico
2.2. Representacin polaca inversa (RPN)
2.3. Representacin mediante cdigo de tres direcciones
3. Traduccin de diferentes partes:
3.1. Declaraciones
3.2. Traduccin de proposicin de asignacin y expresiones
3.3. Traduccin de expresiones lgicas:
3.3.1. Representacin numrica
3.3.2. Generacin de cdigo para evaluar en cortocircuito
3.5. Traduccin de proposiciones de control
Introduccin
Hasta ahora las etapas vistas en el
proceso de compilacin son:
Analizador
Lxico
Analizador
Sintctico
Analizador
Semntico
Generador
de Cdigo
Intermedio
Optimizador
/Generador
de Cdigo
Representacin
en un cdigo
intermedio
3
Introduccin
Cada una de estas etapas tienen como
principal objetivo:
Verificar que el programa fuente est
exento de errores.
Cuando llegamos al bloque de sntesis
podemos asegurar que el programa no
tiene errores.
Si tiene errores no tiene sentido realizar el
proceso de sntesis.
Introduccin
Ventajas de generar cdigo intermedio:
Facilita la redestinacin:
Permite crear compiladores para mquinas
distintas reutilizando las etapas iniciales.
Hace que el optimizador de cdigo pueda
ser independiente de la mquina destino
Posibilidad de aplicar optimizacin al CI.
4
ndice
1. Introduccin
1.1. Por qu escribir cdigo intermedio
2. Lenguajes intermedios
2.1. Representacin mediante rbol semntico
2.2. Representacin polaca inversa (RPN)
2.3. Representacin mediante cdigo de tres
direcciones
3. Traduccin de diferentes partes:
3.1. Declaraciones
3.2. Traduccin de proposicin de asignacin y expresiones
3.3. Traduccin de expresiones lgicas:
3.5. Traduccin de proposiciones de control
Lenguajes intermedios
Existen lenguajes intermedios para la
representacin:
rbol semntico
Notacin postfija (RPN)
Cdigo de tres direcciones
5
Lenguajes intermedios
rbol semntico:
Representacin grfica
Representacin jerrquica natural
Lenguajes intermedios
Notacin postfija (RPN):
Basada en el rbol semntico
Coincide con el recorrido en profundidad del
rbol
No se representa un nodo mientras no se
hayan representado todos sus hijos.
6
Lenguajes intermedios
Notacin postfija:
Ejemplo:
Lenguajes intermedios
Notacin postfija:
Ejemplo:
7
Lenguajes intermedios
Notacin postfija:
Ejemplo:
Lenguajes intermedios
Notacin postfija:
Ejemplo:
8
Lenguajes intermedios
Notacin postfija:
Ejemplo:
Lenguajes intermedios
Notacin postfija:
Ejemplo:
9
Lenguajes intermedios
Notacin postfija:
Ejemplo:
Lenguajes intermedios
Cdigo de tres direcciones:
Secuencia de proposiciones de la forma:
x = y op z
Dos direcciones para los operando
Una direccin para el resultado
Un campo para la operacin.
10
Lenguajes intermedios
Cdigo de tres direcciones:
No se admiten operaciones compuestas
Ejemplo: a=b+c*d-e
Tmp1=c*d
Tmp2=b+tmp1
Tmp3=tmp2-e
a=tmp3
Lenguajes intermedios
Las principales proposiciones:
x := y ob z;
x:= ou y;
x:=y; Copia
goto etiqueta; Salto
if v goto etiq; Si entonces
param x; (parmetro x)
call p, n; (llamada al proc. p con n parmetros)
Ej.: la llamada p(x1,...,xn) genera
param x1
....
param xn
call p, n
11
Lenguajes intermedios
Las proposiciones la decidimos
nosotros.
Pocas: genera secuencias largas el
optimizador/generador complicado.
Muchas: poca libertad de implantacin de
diferentes mquinas.
Lenguajes intermedios
En la prctica el compilador no escribe
estas proposiciones
Ms cmodo trabajar con registros que las
representan (sus campos)
Estas implantaciones son:
Cuartetos (op arg1 arg2 resultado)
Tercetos (op arg1 arg2)
Tercetos indirectos
12
Lenguajes intermedios
Cuartetos:
Cada proposicin consta de 4 elementos
(operador, arg1, arg2, resultado)
Arg1, arg2 y resultado son entradas de la TS
Lenguajes intermedios
Tercetos:
Como los cuartetos pero eliminando el
campo de resultado.
Se sustituyen las variables temporales
(resultado) por la referencia a las
proposiciones que las calculan.
13
Lenguajes intermedios
Tercetos indirectos:
Como los tercetos pero manteniendo un
vector de punteros a proposiciones del
cdigo.
Lenguajes intermedios
Ventajas e inconvenientes:
Cuartetos:
Direccin de las variables temporales
directamente accesible.
Reubicacin del cdigo fcil.
Tabla de smbolos grande.
Tercetos:
Tabla de smbolos pequea.
Reubicacin ms fcil.
14
Lenguajes intermedios
Ventajas e inconvenientes:
Tercetos indirectos:
Reubicacin fcil.
Uso eficiente de memoria.
Tabla de smbolos pequea.
ndice
1. Introduccin
1.1. Por qu escribir cdigo intermedio
2. Lenguajes intermedios
2.1. Representacin mediante rbol semntico
2.2. Representacin polaca inversa (RPN)
2.3. Representacin mediante cdigo de tres
direcciones
3. Traduccin de diferentes partes:
3.1. Declaraciones
3.2. Traduccin de proposicin de asignacin y expresiones
3.3. Traduccin de expresiones lgicas:
3.5. Traduccin de proposiciones de control
15
Traduccin de declaraciones
Pasos:
Insertar identificadores.
(lexema, tipo, direccin relativa)
Comprobacin de declaracin mltiple.
Comprobacin de tipos.
Traduccin de declaraciones
Ejemplo:
A ::= S
S ::= T LiD ; | T LiD ; S1
T ::= bool | real | int | char
LiD ::= ID | ID , LiD1
ID ::= id | * id | id[cte]
16
Traduccin de declaraciones
A ::= S
S ::= T {LiD.tipo = T.tipo;} LiD;
S ::= T {LiD.tipo = T.tipo;} LiD; S1
T ::= bool {T.tipo = b;}
T ::= real {T.tipo = r;}
T ::= int {T.tipo = i;}
T ::= char {T.tipo = c;}
LiD ::= {ID.tipo=LiD.tipo;}ID
LiD ::= {ID.tipo=LiD.tipo;} ID {LiD1.tipo=LiD.tipo;}, LiD1
ID ::= id {id.ts=insert(id, id.tipo, ??);
if(id.ts<=0) error(); }
ID ::= * id {id.ts=insert(id, pointer(id.tipo), ??);
if(id.ts<=0) error(); }
ID ::= id[cte] {id.ts=insert(id,array(id.tipo,cte.val), ??);
Traduccin de declaraciones
A ::= S
S ::= T {...; LiD.tam = T.tam;}LiD;
S ::= T {...; LiD.tam = T.tam;}LiD; S1
T ::= bool {...; T.tam = 1;}
T ::= real {...; T.tam = 8;}
T ::= int {...; T.tam = 4;}
T ::= char {...; T.tam = 1;}
LiD ::= {...; ID.tam = LiD.tam;}ID
LiD ::= {...; ID.tam = LiD.tam;} ID {...;LiD1.tam=LiD.tam;}, LiD1
ID ::= id {id.ts=insert(id, id.tipo, ??); if(...) ...}
ID ::= * id {id.ts=insert(id, pointer(id.tipo), ??); if(...)..}
ID ::= id[cte] {id.ts=insert(id,array(id.tipo,cte.val), ??);
17
Traduccin de asignacin y
expresiones
tempNuevo: genera un temporal nuevo distinto
A. lxico comprueba si id est la TS y devuelve lexema
entrada *busca(lexema) ,, si existe lexema en la TS
Emite: genera la cadena que se le pasa
PD;S
S id := E {emite(busca(id.lexema) := E.lugar)}
E E1 + E2 {E.lugar=tempNuevo; emite(E.lugar := E1.lugar + E2.lugar);}
|E1 * E2 {E.lugar=tempNuevo; emite(E.lugar := E1.lugar * E2.lugar);}
|- E1 {E.lugar=tempNuevo; emite(E.lugar := menosU E1.lugar);}
|(E1) {E.lugar=E1.lugar;}
|id {E.lugar=busca(id.lexema)}
Traduccin de asignacin y
expresiones
Expresiones lgicas
Dos formas de traducir:
Clculo del valor de verdad de la expresin
Generar clculo de valor
Clculo del flujo de control
Generar clculo de la direccin de salto.
Gramtica:
E::=E or T | T
T ::= T and F | F
F ::= not F | true | false | (E)
18
Traduccin de asignacin y
expresiones
Clculo del valor de verdad de la
expresin
E::= T {E.lugar= T. lugar; E.cod= T.cod}
T::=F {T.lugar = F.lugar; T.cod=F.cod}
F::= (E) {F.lugar=E.lugar; F.cod=E.cod}
Traduccin de asignacin y
expresiones
E::=E1 or T {E.lugar=nuevoTemp();
E.cod= E1.cod || T.cod || gen(E.lugar =
E1.lugar or T.lugar);}
T::= T1 and F {T.lugar=nuevoTemp();
T.cod= T1.cod || F.cod || gen(T.lugar =
T1.lugar and F.lugar)}
19
Traduccin de asignacin y
expresiones
F::= not F1 {F.lugar = nuevoTemp();
F.cod=F1.cod || gen (F.lugar =not
F1.lugar)}
F::= true {F.lugar=nuevoTemp();
F.cod=gen(F.lugar = 1)}
F::= false {F.lugar=nuevoTemp();
F.cod=gen(F.lugar = 0)}
Traduccin de asignacin y
expresiones
Clculo del flujo de control
E ::= {T.v = E.v; T.f = E.f;}
T {E.cod = T.cod;}
T ::= {F.v = T.v; F.f = T.f;}
F{T.cod = F.cod;}
F ::= not {F1.v = F.f; F1.f = F.v;}
F1 {F.cod = F1.cod;}
20
Traduccin de asignacin y
expresiones
F ::= true {F.cod = gen(goto, F.v);}
F ::= false {F.cod = gen(goto, F.f);}
F ::= ({E.v = F.v; E.f = F.f;}
E) {F.cod = E.cod;}
E ::= {E1.v = E.v; E1.f = nuevaEtiq();
T.v = E.v; T.f = E.f;}
E1 or T{E.cod = E1.cod ||
gen(E1.f,:) || T.cod;}
T ::= {T1.f = T.f; T1.v = nuevaEtiq();
F.v = T.v; F.f = T.f;}
T1 and F{T.cod = T1.cod ||
gen(T1.v,:) || F.cod;}
Traduccin de asignacin y
expresiones
Exp. lgicas mediante cdigo en cortocircuito
No es necesario evaluar toda la expresin.
Las etVerdad y etFalso facilitan la generacin de
sentencias de control
Ej. e1 or e2, el cdigo que se genera:
if e1 goto etVerdad;
Goto etFalso1;
etFalso1: if e2 goto etVerdad;
Goto etFalso;
etVerdad: .....
etFalso:.....
21
Traduccin de asignacin y
expresiones
If a goto VerdadG
Goto FalsoL
FalsoL: if b goto VerdadG
Goto FalsoG
VerdadG: S1
FalsoG:.....
If (a or b) S1;
Traduccin de proposiciones de
control
Sif E then S1 {E.verdadera:=etiNueva;
E.falsa:=S.siguiente;
S1.siguiente:=S.siguiente;
S.codigo:=E.codigo + gen(E.verdadera:)+S1.codigo;}
|while E do S1 {E.verdadera:=etiNueva;
E.falsa:=S.siguiente;
S1.siguiente:=S.comienzo;
S.comienzo:=etiNueva;
S.codigo:=gen(S.comienzo:)+E.codigo +
gen(E.verdadera:)+S1.codigo+gen(goto S.comienzo);}

You might also like