Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Traductores e Interpretes
Traductores e Interpretes
Tema 6
Tipos y generacin de cdigo
ndice General
Tabla de smbolos
Representaciones intermedias
Sistema de tipos
Sobrecarga de operadores
Comprobaciones y conversiones de tipos
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
Tabla de smbolos
Tabla de smbolos
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
Tabla de smbolos
Informacin
Variable
Funcin
Tipo
Constante
Tabla de smbolos
Funciones
Eficiencia en la bsqueda
Aadir un smbolo
Buscar un smbolo
Uso de tablas hash
Objetos como registros de informacin
Tabla de smbolos
Ejercicio
Tipo de smbolo
{ ENTERO, 2, 100 }
{ ENTERO, 2, 102 }
{ REAL, 4, 104 }
{ REAL, 4, 108 }
{ CARACTER, 1, 112 }
{ CARACTER, 1, 113 }
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?
}}
}}
Solucin
a
i
1
1
2
2
a
b
a
i
a
b
Ejemplo
1
1
2
2
a
b
a
i
Buscar un smbolo
Ejemplo
Buscando b
1
1
2
2
a
b
a
i
Representaciones intermedias
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
Representaciones intermedias
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
Representaciones Intermedias
Ejemplo
(2+3)*(2+3+5)
+
+
3
2
Representaciones Intermedias
Ejemplo
(2+3)*(2+3+5)
+
Representaciones intermedias
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
Representaciones intermedias
Operadores sobrecargados
Solucin
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
Inferencia de tipos
Conversiones de tipos
Utilizamos
ETDS
Tabla de smbolos
{{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
Ejemplo
Genera ()
NuevoTemp()
X.lugar
X.cdigo
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:=
:=}}
nuevaEtiqueta
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
nuevaEtiqueta
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:
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
Tipos compuestos
Tabla de tipos
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
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 Tipos
14
Tipos compuestos
ifif(true)
(true){{
int
inti,i,a;
a;
Tabla de
tipos para 2
aa==8;
8;
bb==a;
a;
i i==aa++b;
b;
}}
}}
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
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}}
++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
Comprobaciones semnticas
Problema
Por tanto
17
Bibliografa
[AJO]
[GARRIDO]
18