Está en la página 1de 18

UNIVERSIDAD NACIONAL DE EDUCACIN A DISTANCIA

Escuela Tcnica Superior de Ingeniera Informtica


Procesadores de Lenguajes

Tema 6
Tipos y generacin de cdigo

Javier Vlez Reyes


jvelez@lsi.uned.es

Javier Vlez Reyes jvelez@lsi.uned.es

Aprender a utilizar los ETDS para

Obtener informacin acerca de los tipos


Generar cdigo intermedio

Estudiar las relaciones entre

Objetivos del Tema

Los tipos del lenguaje


La generacin de cdigo intermedio

Estudiar el uso de la tabla de smbolos


Estudiar los problemas de mbito
Estudiar posibles representaciones intermedias

Javier Vlez Reyes jvelez@lsi.uned.es

ndice General

Tabla de smbolos

Representaciones intermedias

Los mbitos y la tabla de smbolos


Cdigo de tres direcciones
rboles abstractos
Grafos dirigidos acclicos
Cdigo de Mquina virtual

Sistema de tipos

Sobrecarga de operadores
Comprobaciones y conversiones de tipos

Javier Vlez Reyes jvelez@lsi.uned.es

ndice General

Cdigo intermedio

Para expresiones
Para sentencias de control de flujo condicional
Para sentencias de control de flujo iterativo

Tipos compuestos

La tabla de tipos
mbitos y la tabla de tipos
Cdigo intermedio para tipos compuestos

Cdigo intermedio para arrays


Cdigo intermedio para registros

Javier Vlez Reyes jvelez@lsi.uned.es

Tabla de smbolos

Tabla de smbolos

Es una tabla que se utiliza para almacenar los nombres


definidos por el usuario en el programa fuente

Variables
Nombres de funciones
Nombres de tipos

AnlisisLxico
Lxico
Anlisis
AnlisisSintctico
Sintctico
Anlisis
AnlisisSemntico
Semntico
Anlisis
Tabla de
smbolos

Generacinde
de
Generacin
cdigointermedio
intermedio
cdigo
Optimizacinde
de
Optimizacin
cdigointermedio
intermedio
cdigo
Generacinde
de
Generacin
cdigoobjeto
objeto
cdigo

Javier Vlez Reyes jvelez@lsi.uned.es

Tabla de smbolos

Se utiliza para comprobar

Uso de variables no declaradas


Variables declaradas varias veces
Incompatibilidad en los tipos de una expresin
Etc.

Para cada entrada hay un registro de informacin


Tipo de smbolo

Informacin

Variable

Nombre, tipo, tamao, direccin

Funcin

Nombre, tipo, comienzo del cdigo

Tipo

Nombre, tipo, tamao

Constante

Nombre, tipo, tamao, valor

Javier Vlez Reyes jvelez@lsi.uned.es

Tabla de smbolos

Funciones

Eficiencia en la bsqueda

Aadir un smbolo
Buscar un smbolo
Uso de tablas hash
Objetos como registros de informacin

Aadir implica buscar

Comprobar si existe el smbolo en la tabla


Si existe emitir un error
Si no existe insertar el smbolo

Javier Vlez Reyes jvelez@lsi.uned.es

Tabla de smbolos

Ejercicio

Dado el programa, Cul es su tabla de smbolos?


int
inta,
a,b;
b;
float
floatc,c,d;
d;
char
chare,
e,f;f;

Tipo de smbolo

Informacin {TIPO, TAMAO, DIR}

{ ENTERO, 2, 100 }

{ ENTERO, 2, 102 }

{ REAL, 4, 104 }

{ REAL, 4, 108 }

{ CARACTER, 1, 112 }

{ CARACTER, 1, 113 }

Javier Vlez Reyes jvelez@lsi.uned.es

Tabla de smbolos

La tabla de smbolos y los ETDS

Los smbolos deben insertarse cuando aparecen en G


Deben ubicarse correctamente las acciones semnticas
Puede ser preciso redisear la gramtica

En relacin con la tabla de smbolos, los errores son

Utilizar una variable no declarada


Declarar dos veces una variable
Desbordamiento en memoria de la tabla de smbolos

Javier Vlez Reyes jvelez@lsi.uned.es

Los mbitos y la Tabla de smbolos

mbitos anidados
Pueden existir distintos mbitos de declaracin anidados
Cada mbito declara variables
Pueden solaparse nombres
{{
Cmo se resuelve b en (2)?
int
inta,
a,b;
b;
Primero busca en (2)
aa==7;
7;
Si no existe busca en (1)
a?
ifif(true)
(true){{
int
inti,i,a;
a;
aa==8;
8;
bb==a;
a;
i i==aa++b;
b;

1
2
a, b, i?
a, b, i?

}}
}}

Javier Vlez Reyes jvelez@lsi.uned.es

Los mbitos y la Tabla de smbolos

Cuando se sale de un mbito

Deben olvidarse las variables declaradas en l


Deben eliminarse las entradas de la tabla de smbolos

Solucin

O asociar un campo de mbito a las entradas de la tabla

O crear una pila de tabla de smbolos


2

a
i

1
1
2
2

a
b
a
i

a
b

Javier Vlez Reyes jvelez@lsi.uned.es

Los mbitos y la Tabla de smbolos

Aadir un nuevo smbolo

Al aadir un nuevo smbolo se debe buscar slo entre


los smbolos del mismo mbito
Se comienzan las bsquedas comenzando desde el final
de la tabla y terminando cuando se llega al principio de
la tabla o cuando el nivel de anidamiento es menor que
el actual

Ejemplo
1
1
2
2

a
b
a
i

Javier Vlez Reyes jvelez@lsi.uned.es

Los mbitos y la Tabla de smbolos

Buscar un smbolo

Al buscar un smbolo que aparece en una instruccin se


debe buscar el smbolo desde el final de la tabla hasta el
principio, de manera que se encuentre el smbolo del
mbito no cerrado ms cercano

Ejemplo

Buscando b
1
1
2
2

a
b
a
i

Javier Vlez Reyes jvelez@lsi.uned.es

Los mbitos y la Tabla de smbolos

Consideraciones sobre variables

Si el compilador asigna direcciones de memoria a las


variables, stas deben ser reutilizadas cuando se cierra
el mbito

Consideraciones sobre funciones

El cuerpo de una funcin es considerado un mbito


Los argumentos son lo primero que se almacena en la
tabla de smbolos del mbito de la funcin

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones intermedias

El cdigo intermedio como frontera


AnlisisLxico
Lxico
Anlisis

Independencia
fsica

AnlisisSintctico
Sintctico
Anlisis
AnlisisSemntico
Semntico
Anlisis
Generacinde
decdigo
cdigo
Generacin
intermedio
intermedio

Tabla de
smbolos

Gestin de
errores

Optimizacinde
decdigo
cdigo
Optimizacin
intermedio
intermedio
Generacinde
decdigo
cdigo
Generacin
objeto
objeto

Dependencia
fsica

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones intermedias

Cdigo de tres direcciones

Representacin mediante tercetos


Operador

Representacin mediante cuartetos


Operador

Resultado / Operando 1 Operando 2

Operando 1 Operando 2 Resultado

Ejemplo

Cuartetos
(2+3) * (2+3+5)

ADD
ADD
ADD
ADD

22
22

33
33

t1
t1
t2
t2

ADD
ADD
MUL
MUL

t2
t2
t1
t1

55
t3
t3

t3
t3
t4
t4

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones Intermedias

rboles sintcticos abstractos

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

Ejemplo

(2+3)*(2+3+5)

+
+

3
2

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones Intermedias

Grafos dirigidos acclicos

Surgen de rboles sintcticos abstractos


Se reutilizan expresiones comunes
Ms ptimo

Ejemplo

(2+3)*(2+3+5)
+

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones intermedias

Cdigo de una mquina virtual

Se codifica a una mquina virtual de pila


La transformacin a una mquina concreta es compleja
Tambin se utilizan mquinas virtuales con registros
Java & JVM es un ejemplo

Ejemplo

(2+3) * (2+3+5)
Mquina virtual a pila

lda
lda22
lda
lda33
add
add
lda
lda22
lda
lda33
add
add
lda
lda55
add
add
mul
mul

Javier Vlez Reyes jvelez@lsi.uned.es

Representaciones intermedias

Operadores sobrecargados

Solucin

Los lenguajes intermedios no admiten sobrecarga


Los lenguajes fuente s admiten sobrecarga
Si los dos operandos son del mismo tipo se genera una
operacin para ese tipo
Si los dos operandos son de dos tipos compatibles debe
generar cdigo para convertir el tipo

Ejemplo

2*3+0.5

IMUL
IMUL 22
ITOR
ITOR t1
t1
RADD
RADD t2
t2

33

t1
t1
t2
t2

0.5
0.5

t3
t3

10

Javier Vlez Reyes jvelez@lsi.uned.es

Comprobacin y conversiones de tipos

Durante el anlisis semntico el compilador realiza

Inferencia de tipos
Conversiones de tipos

La informacin de tipos es importante

Para generar el cdigo intermedio en consonancia

Realizar inferencia de tipos


Realizar conversiones implcitas
Detectar errores de tipo

Para dar soporte a la sobrecarga de operadores

Utilizamos

ETDS
Tabla de smbolos

Javier Vlez Reyes jvelez@lsi.uned.es

Comprobacin y conversiones de tipos

Ejemplo 8.4 (Pgina 162, texto base)


I I::=
::=idid:=
:=

{{SiSiBusca
Busca(id.lexema)
(id.lexema)no
noencontrado
encontrado
ErrorSemantico
ErrorSemantico( () ) }}
EE

EE::=
::=EE1 1++TT

{{SiSiTipo
Tipo(id.lexema)
(id.lexema)==
==ENTERO
ENTEROyy
E.Tipo
E.Tipo==
==REAL
REAL ErrorSemantico
ErrorSemantico( () ) }}
{{ SiSiEE1.Tipo
==
ENTERO
y
T.Tipo
== ENTERO E.Tipo = ENTERO
1.Tipo == ENTERO y T.Tipo == ENTERO E.Tipo = ENTERO
SiSiE1.Tipo
E1.Tipo==
==ENTERO
ENTEROyyT.Tipo
T.Tipo==
==REAL
REAL E.Tipo
E.Tipo==REAL
REAL
SiSiE1.Tipo
E1.Tipo==
==REAL
REALyyT.Tipo
T.Tipo==
==ENTERO
ENTERO E.Tipo
E.Tipo==REAL
REAL
SiSiE1.Tipo
E1.Tipo==
==REAL
REALyyT.Tipo
T.Tipo==
==REAL
REAL E.Tipo
E.Tipo==REAL
REAL}}

EE::=
::=TT
TT::=
::=nint
nint

{{ E.Tipo
E.Tipo==T.Tipo
T.Tipo}}
{{ T.Tipo
=
ENTERO
T.Tipo = ENTERO}}

TT::=
::=nreal
nreal
TT::=
::=idid

{{ T.Tipo
T.Tipo==REAL
REAL}}
{{ SiSiBusca
(id.lexema)
Busca (id.lexema)no
noencontrado
encontrado ErrorSemantico
ErrorSemantico()
()
SiSino
no T.Tipo
T.Tipo==Tipo
Tipo(id.lexema)
(id.lexema)}}

11

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para expresiones

Ejemplo

Genera ()
NuevoTemp()
X.lugar
X.cdigo

Genera cdigo de 3 direcciones


Genera un nuevo temporal
Nombre del temporal para X
Cdigo de X

SS::=
::=idid:=
:=EE
EE::=
E
*
::= E1 1 *EE2 2

{{S.cdigo
S.cdigo:=
:=E.cdigo
E.cdigo||||genera(
genera(id.lugar
id.lugar:=
:=E.lugar
E.lugar) )}}
{{E.lugar
:=
nuevoTemp()
E.lugar := nuevoTemp()
|| E2.cdigo ||
E.cdigo
E.cdigo:=
:=EE1.cdigo
1.cdigo || E2.cdigo ||
genera
.lugar*
*EE2.lugar
.lugar) ) }}
genera(E.lugar
(E.lugar:=
:=EE1.lugar

EE::=
::=EE1 1++EE2 2

{{E.lugar
E.lugar:=
:=nuevoTemp()
nuevoTemp()
|| E2.cdigo ||
E.cdigo
E.cdigo:=
:=EE1.cdigo
1.cdigo || E2.cdigo ||
genera
genera(E.lugar
(E.lugar:=
:=E1.lugar
E1.lugar+
+E2.lugar
E2.lugar) ) }}

EE::=
::=- -EE1 1

{{E.lugar
E.lugar:=
:=nuevoTemp()
nuevoTemp()
||
E.cdigo
E.cdigo:=
:=EE1.cdigo
1.cdigo ||
}
genera
(E.lugar
genera (E.lugar:=
:= --EE1.lugar)
1.lugar) }
{{E.lugar
:=
E
.lugar
E.lugar := E1 1.lugar
||
E.cdigo
E.cdigo:=
:=EE1.cdigo
1.cdigo ||
genera
genera(E.lugar
(E.lugar:=
:= --E1.lugar)
E1.lugar) }}

EE::=
::=( (EE1 1) )
EE::=
::=idid

{{E.lugar
E.lugar:=
:=id.Lugar
id.Lugar
E.cdigo
E.cdigo:=
:=}}

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para instrucciones

Control de flujo condicional

nuevaEtiqueta

Genera una nueva etiqueta de salto

SS::=
::=ififEEthen
thenSS1 1else
elseSS2 2

{{ SS2.inicio
.inicio:=
:=nuevaEtiqueta()
nuevaEtiqueta()
:=
nuevaEtiqueta()
SS22.fin
.fin
:=
nuevaEtiqueta()
2
S.cdigo
S.cdigo==E.cdigo
E.cdigo||||
genera(if
genera(ifE.lugar
E.lugar=
=false
false goto
goto SS2.inicio)
.inicio)||||
SS1.cdigo
|| genera(goto S2.fin) || 2
1.cdigo || genera(goto S2.fin) ||
:) || S2.cdigo ||
genera(S
genera(S2.inicio
2.inicio :) || S2.cdigo ||
:) }
genera(S
genera(S2.fin
2.fin :) }

E.cdigo
If E.lugar = false goto S2.inicio
S1.cdigo
Goto S2.fin

S2.inicio:

S2.cdigo

S2.fin:

12

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para instrucciones

Control de flujo iterativo

nuevaEtiqueta

Genera una nueva etiqueta de salto

SS::=
::=while
whileEEdo
doSS1 1

{{ S.inicio
S.inicio:=
:=nuevaEtiqueta()
nuevaEtiqueta()
S.fin
S.fin:=
:=nuevaEtiqueta()
nuevaEtiqueta()
S.cdigo
S.cdigo==genera(S.inicio
genera(S.inicio:)
:)||||E.cdigo
E.cdigo||||
genera(if
genera(ifE.lugar
E.lugar=
=false
false goto
goto S.fin)
S.fin)||||
|| genera(goto S.inicio) ||
SS1.cdigo
1.cdigo || genera(goto S.inicio) ||
:) }
genera(S
genera(S2.fin
2.fin :) }

S.inicio:

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

S.fin:

Javier Vlez Reyes jvelez@lsi.uned.es

Tipos compuestos

Tipos compuestos

Punteros
Arrays
Registros
Funciones

Notacin

Puntero (tipo)
Array (min..max, tipo)
Registro ((nombre: tipo) x x (nombre: tipo))
(tipo x tipo) -> tipo

13

Javier Vlez Reyes jvelez@lsi.uned.es

Tipos compuestos

Tabla de tipos

La tabla de tipos se utiliza para almacenar toda la


informacin necesaria para la gestin de los tipos
compuestos
Es una variable global del compilador (como TS)
Es necesario definir funciones

Aadir Tipos
Buscar Tipos

Proceso
1.1.
2.2.

Se
Sealmacenan
almacenantodos
todoslos
lostipos
tiposbsicos
bsicos
Por
cada
nuevo
tipo
compuesto
Por cada nuevo tipo compuestoque
queaparece
apareceen
enelelprograma
programa
1.1. Se
Seaade
aadesu
sutipo
tipoaalalatabla
tablade
detipos
tipos
2.2. Se
relaciona
con
el
tipo
base
que
Se relaciona con el tipo base queutiliza
utiliza
3.3. Se
aaden
los
smbolos
de
ese
tipo
Se aaden los smbolos de ese tipoen
enlalatabla
tablade
desmbolos
smbolos

Javier Vlez Reyes jvelez@lsi.uned.es

Tipos compuestos

Ejemplo
int
inta;
a;
float
float**b;
**b;
char
charc[10];
c[10];
int
intd[4][7];
d[4][7];
float
float*e[15];
*e[15];
struct
struct{{
float
floatf;f;
int
intg;
g;
}}h;
h;
int
intfuncion
funcion(char,
(char,float,
float,int);
int);

Tabla de Smbolos Global

Tabla de Tipos

Tabla de Smbolos TS1

14

Javier Vlez Reyes jvelez@lsi.uned.es

Tipos compuestos

mbitos y la tabla de tipos

La gestin es igual a la de la tabla de smbolos


Cuando se entra en un mbito se define una nueva TT
Cuando se abandona un mbito se destruye la TT
Una excepcin a esto es el procesamiento de funciones
{{
int
inta,a,b;
b;
aa==7;
7;
Tabla de tipos
para 1

ifif(true)
(true){{
int
inti,i,a;
a;

Tabla de
tipos para 2

aa==8;
8;
bb==a;
a;
i i==aa++b;
b;
}}
}}

Javier Vlez Reyes jvelez@lsi.uned.es

Tipos compuestos

Equivalencia de tipos

Equivalencia de nombres
Dos
Dostipos
tiposson
sonconsiderados
consideradosiguales
igualesooequivalentes
equivalentessisitienen
tienen
exactamente
exactamenteelelmismo
mismonombre
nombre

Equivalencia estructural
Dos
Dostipos
tiposson
sonconsiderados
consideradosiguales
igualesooequivalentes
equivalentessisitienen
tienen
lalamisma
estructura
misma estructura

Ejemplo
int *a;
typedef int *punteroAEntero;

Son a y b de tipos
equivalentes ?

punteroAEntero b;

15

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays

Declaraciones de variables simples y arrays


DD::=
::=
DD::=
::=
Var
Var::=
::=

DDVar
Var
Var
Var
Tipo
Tipo

{{L.Th
L.Th:=
:=Tipo.t
Tipo.t; ;L.tamh
L.tamh:=
:=Tipo.tam
Tipo.tam}}

LL; ;
Tipo
Tipo::=
::=int
int
Tipo
Tipo::=
::=float
float

{{Tipo.t
Tipo.t:=
:=ENTERO
ENTERO; ;Tipo.tam
Tipo.tam:=
:=22}}

Tipo
Tipo::=
::=char
char
LL::=
::=

{{Tipo.t
Tipo.t:=
:=CARCTER
CARCTER; ;Tipo.tam
Tipo.tam:=
:=11}}

{{Tipo.t
Tipo.t:=
:=REAL
REAL; ;Tipo.tam
Tipo.tam:=
:=44}}
{{L1L.th := L.th ; L1.tamh := L.tamh }
1.th := L.th ; L1.tamh := L.tamh }
{{V.th
V.th:=
:=L.th
L.th; ;V.tamh
V.tamh:=
:=L.tamh
L.tamh}}

L1L, ,
1

VV
LL::=
::=

{{V.th
V.th:=
:=L.th
L.th; ;V.tamh
V.tamh:=
:=L.tamh
L.tamh}}

VV::=
::=

VV
idid

AA::=
::=

AA
[ [nint
nint] ]

AA::=
::=

AA1
1

{{A.th
A.th:=
:=V.th
V.th; ;A.tamh
A.tamh:=
:=V.tamh
V.tamh}}
{{GuardaSimbolo
GuardaSimbolo(id.lexema,
(id.lexema,A.tipo,
A.tipo,A.tam)
A.tam)}}
{{AA
:= A.th ; A1.tamh := A.tamh}
1.th
1.th := A.th ; A1.tamh := A.tamh}
{{A.tipo
1.tipo);
1.tam
A.tipo:=
:=NuevoArray(nint.valex,
NuevoArray(nint.valex,AA
.tipo);A.tam
A.tam:=
:=AA
.tam**nint.valex
nint.valex}}
1

{{A.tipo
A.tipo:=
:=A.th
A.th; ;A.tam
A.tam:=
:=A.tamh
A.tamh}}

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para arrays

Acceso a elementos de array

Dada la declaracin de un array Tipo nombre [D1][D2][D3]


Acceso a posicin del array nombre [i][j][k];
La direccin de memoria asociada es
DirBase
DirBase(nombre)
(nombre)++i ixx(D
(D22xxDD33xxTam
Tam(Tipo))
(Tipo))
x
Tam
(Tipo))
++j jxx(D
(D3 x Tam (Tipo))
3

++kkxxTam
Tam(Tipo))
(Tipo))

Recursivamente t1t1:=
:=00
t2
t2:=
:=t1
t1xxDD11++i i
t3
t3:=
:=t2
t2xxDD2 ++j j
2

t4
t4:=
:=t3
t3xxDD33++kk
t5
t5:=
:=DirBase
DirBase(nombre)
(nombre)++t4
t4xxTam
Tam(Tipo)
(Tipo)

16

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 de tipos apropiados
Comprobar que el ndice no excede el rango declarado

Javier Vlez Reyes jvelez@lsi.uned.es

Cdigo intermedio para registros

Cdigo para registros

Si slo se hay registros y tipos simples no hay problema


La direccin de los campos se calcula en compilacin

Problema

La direccin base se suma al desplazamiento del campo


Cdigo intermedio igual que un tipo base

Se puede declarar un array de registros


Un campo de un registro puede ser un array

Por tanto

La direccin base debe calcularse dinmicamente


Es necesario sustituir la direccin base por 2 atributos

Una para el cdigo


Otra para la variable temporal

17

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.

18

También podría gustarte