You are on page 1of 17

UNIVERSIDAD NACIONAL DE EDUCACIN A DISTANCIA Escuela Tcnica Superior de Ingeniera Informtica Procesadores de Lenguajes

Tema 6
Parte II
Generacin de cdigo intermedio

Javier Vlez Reyes jvelez@lsi.uned.es

Javier Vlez Reyes jvelez@lsi.uned.es

Objetivos del Tema

Estudiar la generacin de cdigo intermedio Entender su propsito y funciones Aprender los tipos de lenguajes intermedios Aprender a generar cdigo de tres direcciones Entender las representaciones alternativas Aprender a generar cdigo para
Expresiones Asignaciones Construcciones de control de flujo Acceso a estructuras de datos complejas

Adquirir actitud crtica ante el cdigo intermedio

Javier Vlez Reyes jvelez@lsi.uned.es

ndice General
Introduccin Lenguajes intermedios
rboles sintcticos abstractos Grafos dirigidos acclicos

Generacin de cdigo intermedio


Representacin en cdigo intermedio Cdigo intermedio para expresiones Cdigo intermedio para instrucciones Cdigo intermedio para arrays Cdigo intermedio para registros

Javier Vlez Reyes jvelez@lsi.uned.es

Introduccin
Generacin de cdigo intermedio
Transicin de un rbol de Anlisis Sintctico A un cdigo intermedio cercano a la mquina

Ventajas
Supone una frontera entre el front end y el back end Es un cdigo pretendidamente prximo a la mquina Es independiente de una arquitectura especifica
Registros Memoria Juego de instrucciones Modos de direccionamiento

Los direccionamiento estn en trminos simblicos


Variables temporales Variables locales Variables globales

Se puede aplicar optimizacin a este nivel

Javier Vlez Reyes jvelez@lsi.uned.es

Introduccin
El cdigo intermedio como frontera
Independencia fsica Anlisis Lxico Anlisis Sintctico Anlisis Semntico Tabla de smbolos Generacin de cdigo intermedio Optimizacin de cdigo intermedio Generacin de cdigo objeto Dependencia fsica Gestin de errores

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
rboles sintcticos abstractos (ASA)
El cdigo se representa en forma de rbol donde
Cada nodo no terminal representa un operador Cada nodo terminal representa un operando

Ms prximo al lenguaje fuente

a := b * - c + b * - c a

:= + * b c b * c

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Gramtica
S E E E E E id := E E1 + E2 E1 * E2 - E1 ( E1 ) id S.apn := hazNodo (:=, hazHoja (id, id.lugar), E.apn) E.apn := hazNodo (+, E1.apn, E2.apn) E.apn := hazNodo (*, E1.apn, E2.apn) E.apn := hazNodo ( -, E1.apn) E.apn := E1.apn E.apn := hazHoja (id, id.lugar)

a := b * - c + b * - c a

:= + * b c b * c

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Representacin computacional
Estructura dinmica Tabla de nodos
0 1 2 3 4 5 6 7 8 9 ID b ID c MENOSU 1 POR 0 2 ID b ID c MENOSU 5 POR 4 MAS 3 ID a 9 8 6 7

asigna ID MAS POR ID MENOSU ID POR

ID MENOSU

ID

10 ASIGNA

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Grafos dirigidos acclicos (GDA)
El cdigo se representa en forma de grafo
Cada nodo no terminal representa un operador Cada nodo terminal representa un operando Se reutilizan los nodos

Ms prximo al lenguaje fuente


a := b * - c + b * - c a * b c := +

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Gramtica
S E E E E E id := E E1 + E2 E1 * E2 - E1 ( E1 ) id S.apn := hazNodo (:=, hazHoja (id, id.lugar), E.apn) E.apn := hazNodo (+, E1.apn, E2.apn) E.apn := hazNodo (*, E1.apn, E2.apn) E.apn := hazNodo ( -, E1.apn) E.apn := E1.apn E.apn := hazHoja (id, id.lugar)

a := b * - c + b * - c a

:= + * b c

La operacin hazNodo devuelven un nodo ya existente siempre que sea posible en lugar de construir uno nuevo

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Representacin computacional
Estructura dinmica Tabla de nodos
0 1 2 3 4 5 6 ID b ID c MENOSU 1 POR 0 2 MAS 3 ID a ASIGNA 5 4 3

asigna ID MAS POR ID MENOSU ID

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Cdigo de tres direcciones
Es una secuencia de proposiciones de la forma Donde
X := Y OP Z

X, Y, y Z son nombres de constantes o variables temporales OP representa un operador

No se permiten expresiones aritmticas compuestas Solo hay un operador en el lado derecho Se utilizan variables temporales para codificarlas Ms prximo a la mquina
Se traduce fcilmente a ensamblador Se optimiza fcilmente

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Cdigo de tres direcciones
Es una representacin linealizada de un ASA o un GDA
a := b * - c + b * - c rbol sintctico abstracto t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5 Grafo dirigido acclico t1 := - c t2 := b * t1 t5 := t2 + t2 a := t5

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Cdigo de tres direcciones
Es anlogo al ensamblador Las proposiciones pueden tener etiquetas simblicas Una etiqueta representa el ndice de una proposicin
Pueden sustituirse en una pasada independiente Mediante la tcnica de relleno en retroceso

Existen proposiciones para el flujo de control Los operandos son simblicos


Se utilizan variables o temporales No existen referencias a memoria No existen modos de direccionamiento

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Cdigo de tres direcciones
Es necesario disear un juego de instrucciones
Operaciones de asignacin X := Y OP Z Operaciones de asignacin unaria X := OP Y Proposiciones de copia X := Y Etiquetas E: Salto incondicional a etiqueta BR E Salto condicional a etiqueta BZ E Llamadas a procedimientos
Carga de parmetros param X Llamada a procedimiento call P n

Asignaciones con desplazamiento X [i] := Y o X := Y [i] Asignaciones con indireccin X := &Y X := *Y *X := Y

Javier Vlez Reyes jvelez@lsi.uned.es

Lenguajes intermedios
Cdigo de tres direcciones
Representacin mediante tripletas
Operador Resultado / Operando 1 Operando 2

Representacin mediante cudruplas


Operador Operando 1 Operando 2 Resultado

Ejemplo
cudruplas (2+3) * (2+3+5)
ADD ADD ADD MUL 2 2 t2 t1 3 3 5 t3 t1 t2 t3 t4

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
El cdigo intermedio son cuartetos NuevoTemp () Devuelve una nueva variable temporal X.temp Almacena el nombre del temporal para X X.cdigo Almacena el cdigo intermedio para X
S ::= id := E E ::= E1 * E2 { S.cdigo = E.cdigo || MOVE id.temp E.temp } { E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || MUL E.temp E1.temp E2.temp } { E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || ADD E.temp E1.temp E2.temp } { E.temp := nuevoTemp(); E.codigo := E1.cdigo || UMINUS E.temp E1.temp } { E.temp := id.lexema E.cdigo := }

E ::= E1 + E2

E ::= - ( E1 )

E ::= id

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
id
(d) E.temp := nuevoTemp(); E.codigo := E1.cdigo || UMINUS E.temp E1.temp

d = - (a + b * c)

:=

S.cdigo = E.cdigo || MOVE id.temp E.temp

E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || ADD E.temp E1.temp E2.temp

id

(a)

E.temp := id.lexema E.cdigo :=

E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || MUL E.temp E1.temp E2.temp

id

(b)

E.temp := id.lexema E.cdigo :=

id

(c)

E.temp := id.lexema E.cdigo :=

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para instrucciones


Control de flujo condicional
NuevaEtiqueta () INSETQ E GT t1 t2 t3 BZ t E BR E S ::= if E then S1 else S2 Genera una nueva etiqueta de salto Cuarteto para insertar la etiqueta E: Mayor que (t1=1 si cierto t1=0 si falso) Salta a E si t = 0 Salto incondicional a E: { S2.inicio := nuevaEtiqueta() S2.fin := nuevaEtiqueta() S.cdigo := E.cdigo || BZ E.temp S2.inicio || S1.cdigo || BR S2.fin || INSETQ S2.inicio || S2.cdigo || INSETQ S2.fin } E.codigo If E.temp = false goto S2.inicio S1.cdigo Goto S2.fin

S2.inicio : S2.fin :

S2.cdigo

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
If E1 id
(a) {1} {2}

S Then S1 id
(a)

If (a>b) then a:=0 else b:= b + 1; Else E n


{4} {3}

E >
{1}

S2 id := E id
{1}

{5}

E2

{2}

:=

(b)

E + n

{4}

id {1}
(b) {4} S.cdigo = E.cdigo || MOVE id.temp E.temp

E
{3}

E.temp := id.lexema E.cdigo := E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || GT E.temp E1.temp E2.temp E.temp := n.valor E.cdigo :=

(b)

{3}

{5} S2.inicio := nuevaEtiqueta() S2.fin := nuevaEtiqueta() S.cdigo := E.cdigo || BZ E.temp S2.inicio || S1.cdigo || BR S2.fin || INSETQ S2.inicio || S2.cdigo || INSETQ S2.fin

10

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para instrucciones


Control de flujo iterativo
NuevaEtiqueta () LT t1 t2 t3 EQ t1 t2 t3 S ::= while E do S1 Genera una nueva etiqueta de salto Menor que (t1=1 si cierto t1=0 si falso) Menor que (t1=1 si cierto t1=0 si falso) { S.inicio := nuevaEtiqueta() S.fin := nuevaEtiqueta() S.cdigo := INSETQ S.inicio || E.cdigo || BZ E.lugar S.fin || S.cdigo || BR S.inicio || INSETQ S.fin }

S.inicio :

E.codigo If E.lugar = false goto S.fin S.cdigo Goto S.inicio

S.fin :

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
while E1 id
(a) {1} {2}

while (a < b) do a := a + 1; S do S1 id
(a)

E >
{1}

{5}

E2

{2}

:= E id
{1}

E + n

{4}

id {1}
(b) {4} S.cdigo = E.cdigo || MOVE id.temp E.temp {5} S.inicio := nuevaEtiqueta() S.fin := nuevaEtiqueta() S.cdigo := INSETQ S.inicio || E.cdigo || BZ E.lugar S.fin || S.cdigo || BR S.inicio || INSETQ S.fin

E
{3}

E.temp := id.lexema E.cdigo := E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || LT E.temp E1.temp E2.temp E.temp := n.valor E.cdigo :=

(a)

{3}

11

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Declaraciones de variables simples y arrays
D ::= D Var D ::= Var Var ::= Tipo L; Tipo ::= int Tipo ::= float Tipo ::= char L ::= L1, L ::= V ::= id A A ::= [nint] A1 A := V V { Tipo.t = ENTERO; Tipo.tam = 2; } { Tipo.t = REAL; Tipo.tam = 4; } { Tipo.t = CARCTER; Tipo.tam = 1} { L1.th = L.th; L1.tamh = L.tamh } { V.th = L.th; V.tamh = L.tamh } { V.th = L.th; V.tamh = L.tamh } { A.th = V.th; A.tamh = V.tamh } { GuardaSimbolo (id.lexema, A.tipo, A.tam) } { A1.th = A.th; A1.tamh = A.tamh } {A.tipo = NuevoArray (nint.valex, A1.tipo); A.tam = A1.tam * nint.valex} {A.tipo = A.th; A.tam = A.tamh} { L.Th = Tipo.t; L.tamh = Tipo.tam }

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
Tipo int
t= ent tam=2 th= ent tamh=2

int a[2][3], b[5];

Var
th= ent tamh=2

L
th= ent tamh=2

L
th= ent tamh=2

V
th= ent tamh=2

V id
(a)
th= ent tamh=2 th= ent tamh=2

id
(b)

A A

ts.guarda (id.lexema, A.tam, A.tipo)

A A A

ts.guarda (id.lexema, A.tam, A.tipo)


t= ARRAY (2, ARRAY(ent, 3) tam=6x2=12 t= ARRAY(ent, 3) tam=2X3=6

[n]
(5)

th= ent tamh=2

t= ARRAY(ent, 5) tam=2X5=10

[n]
(2)

t= ent tam=2

[n]
(3)

th= ent tamh=2

Accin semntica Flujo de informacin

t= ent tam=2

(consultar acciones semntica asociadas en la gramtica)

12

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Acceso a elementos de arrays (estilo C)
Sea el array Tipo nombre [D1][D2][D3] El acceso a la posicin nombre [i][j][k] es
DirBase + i x (D2 x D3 x Tam (Tipo)) + j x (D3 x Tam (Tipo)) + k x Tam (Tipo)

Recursivamente t1 := 0
t2 := t1 x D1 + i t3 := t2 x D2 + j t4 := t3 x D3 + k t5 := DirBase (nombre) + t4 x Tam (Tipo)

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Acceso a elementos de arrays (estilo Pascal)
Sea el array nombre: array [LI1..LS1, LI2..LS2, LI3..LS3] El acceso a la posicin nombre [i, j, k] es
DirBase + (i-LI1) x ((LS2-LI2+1) x (LS3-LI3+1) x Tam (Tipo)) + (j-LI2) x ((LS3-LI3+1) x Tam (Tipo)) + (k-LI3) x Tam (Tipo)

Recursivamente t1 := 0
t2 := t1 x (LS1-LI1+1) + (i-LI1) t3 := t2 x (LS2-LI2+1) + (j-LI2) t4 := t3 x (LS3-LI3+1) + (k-LI3) t5 := DirBase (nombre) + t4 x Tam (Tipo)

13

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Ejemplo 8.11
(pgina 180-182, texto base)
Tipo para la variable v Direccin de memoria para la variable v Devuelve la dimensin para el array tipo Devuelve el tipo de base del array tipo Devuelve el tamao en memoria para el tipo tipo (TS) (TS) (TT) (TT) (TT) TipoSimbolo (v.lexema) DireccionSimbolo (v.lexema) DimTipoArray (tipo) TBaseTipoArray (tipo) TamTipo (tipo) Ref ::= id

{ Ref.tipo := TipoSimbolo(id.lexema); Ref.dBase := DireccionSimbolo(id.lexema); temp := NuevoTemp(); Ref.temp := temp; Ref.cod := MOVE temp 0 } { Si !EsArray(Ref1.tipo) ErrorSemantico() } { Si !EsEntero(E.tipo) ErrorSemantico() Si no Ref.tipo := TBaseTipoArray(Ref1.tipo); Ref.dBase := Ref1.dBase temp := NuevoTemp(); Ref.temp := temp; Ref.cod := Ref1.cod || E.cod || MUL Ref.temp Ref1.temp DimTipoArray(Ref1.tipo) ADD Ref.temp Ref.temp E.temp } E]

Ref ::= Ref1 [

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Ejemplo 8.11
(pgina 180-182, texto base)
Tipo para la variable v Direccin de memoria para la variable v Devuelve la dimensin para el array tipo Devuelve el tipo de base del array tipo Devuelve el tamao en memoria para el tipo tipo Copia el valor en t2 a la posicin de memoria apuntada por t1 (TS) (TS) (TT) (TT) (TT) TipoSimbolo (v.lexema) DireccionSimbolo (v.lexema) DimTipoArray (tipo) TBaseTipoArray (tipo) TamTipo (tipo) MOVE @t1 t2

Factor ::= Ref

{ Si EsArray (Ref.Tipo) ErrorSemntico () Si no Factor.tipo := Ref.Tipo; temp := NuevoTemp(); Factor.temp := temp; Factor.cod := Ref.cod || MUL temp Ref.temp TamTipo(Ref.Tipo) ADD temo temp Ref.dBase } { Si EsArray (Ref.Tipo) ErrorSemantico () } { Instr.cod := Ref.cod || E.cod || MOVE @Ref.temp, E.temp }

Instr ::= Ref := E

14

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones


Ejemplo
Ref Instr :=
Tipo = ent dbase = 200 temp = t2 cod = MUL t2 t1 5 ADD t2 t2 E.temp Tipo = ARRAY (ent, 5) dbase = 200 temp = t1 cod = MUL t1 t0 4 ADD t1 t1 E.temp

a [1][2] := b[3] E
temp = t6 cod = MOVE t6 t2 MUL t6 t6 tam (emt) ADD t6 t6 200 Tipo = ent MOVE @t6 t5 temp = t5 cod = Tipo = ent temp = t5 cod = MUL t5 t4 tam(ent) ADD t5 t5 400 Tipo = ent dbase = 400 temp = t4 cod = MUL t4 b 7 ADD t4 t4 E.temp

Ref

[E]

Factor

Ref

[E]

Ref

id

(a)

Tipo = ARRAY ( ARRAY (ent, 5), 4) dbase = 200 temp = t0 cod = MOVE t0 0

Ref
Tipo = ARRAY (ent, 7) dbase = 400 temp = t3 cod = MOVE t3 0

[E]

id

(b)

(3)

E.temp := 3 E.cdigo :=

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays


Comprobaciones semnticas
Comprobar que la variable indexada es un array Comprobar que la dimensin coincide con la declarada Comprobar que los ndices sean apropiados
Constantes, variables o expresiones enteras Hacer una conversin a entero si no lo son (depende del lenguaje) No se excede el lmite inferior No se excede el lmite superior

15

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para registros


Lenguaje sin arrays
El lenguaje slo define tipos simples y registros La direccin de los campos de cualquier registro puede calcularse en tiempo de compilacin sumando la direccin base del registro y el desplazamiento relativo del campo

Ejemplo
struct { char a; int b; } c; #(char) = 1 #(int) =2 #(struct) = 3 Dir (c) = 100 Dir (c.a) = 100 Dir (c.b) = 101

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para registros


Lenguaje con arrays
El lenguaje slo define
Arrays de registros Registros cuyos campos son arrays

La direccin de los campos de cualquier registro no puede calcularse, en general. Se debe generar cdigo intermedio para calcule su direccin en tiempo de ejecucin La direccin de base no es constante y se necesita
CBase. Almacena el cdigo para calcular la direccin de base DBase. Almacena el temporal de la direccin de base

16

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para registros


Lenguaje con arrays. Ejemplo
Instr Ref Ref Ref id
(d)

d[i].c[j]

struct { int a, b; char c[10]; } d[5];


en 100 empieza d el tamao del registro es 14 para alcanzar c hay que sumar 4 (2xtam(ent)) 4 el tamao de c es 10
1 2 3

:= . [E] {2} Ref id


(c)

E Ref [E] {3}

{4}

{1}

{1} tipo = ARRAY (5, RECORD) tamao = 5x14 = 70 dbase = t1 cbase = MOV t1 1001 temp = t2 cod = MOVE t2 0

{2} tipo = RECORD () tamao = 14 dbase = t1 cbase = MOV t1 100 temp = t3 cod = MOVE t3 t2 MUL t3 t3 5 ADD t3 E.temp

tipo = ARRAY (char, 10) {3} tamao = 10x1 = 10 dbase = t4 cbase = MOVE t4 t3 MUL t4 t4 142 ADD t4 t4 t1 ADD t4 t4 43 temp = t5 cod = MOVE t5 0

{4} tipo = char tamao = 1 dbase = t4 cbase = temp = t6 cod = MUL t6 t5 104 ADD t6 t6 E.temp

Javier Vlez Reyes jvelez@lsi.uned.es

Bibliografa
[AJO] AHO, SETHI, ULLMAN: Compiladores: Principios, tcnicas y herramientas,: Addison-Wesley Iberoamericana, 1990

[GARRIDO]

A. Garrido, J. Iesta, F. Moreno y J. Prez. 2002. Diseo de compiladores. Universidad de Alicante.

17

You might also like