Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Verificaciontipos05 06
Verificaciontipos05 06
Procesadores de
Lenguaje II
Comprobacin de Tipos
Introduccin
Sistemas de tipos
Expresiones de tipos
Sistemas de tipos
Comprobacin esttica y dinmica de tipos
Tablas de Smbolos
Comprobacin de Tipos
Un comprobador de tipos
Ubicacin:
rbol
sintctico
abstracto
tokens
Analizador
Analizador
sintctico
sintctico
Comprobador
Comprobador
Detipos
tipos
De
rbol
sintctico
abstracto
Cdigo
intermedio
Generadorde
de
Generador
Cdigo
Cdigo
intermedio
intermedio
< : boolean
* : int
3 : int
2 : int
: error
if (E) then S
= : int
= : int
a : int
b : int1
x : int
1 : int
Comprobacin de Tipos
Un lenguaje especifica que operaciones son vlidas
para cada tipo
Se detectan errores
Tipos de lenguajes:
Expresiones de tipos I
Representan el tipo de las construcciones
Pueden ser
Un tipo bsico
Expresiones de tipos II
Expresiones de tipos
1.
2.
3.
a)
Tipos bsicos
El nombre de un tipo es una expresin de tipo
Constructores de tipos y expresiones de tipos son
tipo
Arrays
Si T es una expresin de tipo entonces array (I, T) es una
expresin de tipo que indica una matriz con elementos de tipo
T y conjunto de ndices I
Var A: array[1..10] of integer es array (1..10, integer)
b)
Productos
Si T1 y T2 son expresiones de tipo, su producto cartesiano T1 x
T2 es una expresin de tipo (x es asociativo por la izquierda)
Registros
Tiene como tipo el producto de los tipos de los campos. El constructor
de tipo record se aplica a una tupla formada con nombres de
campos y tipos de campos. Ej:
type fila = RECORD
direccion: integer;
lexema: array [1..15] of Char;
END;
var tabla: array [1..10] of fila
fila tiene el tipo:
record ((direccin x integer) x (lexema x array(1..15, Char)))
Tabla tiene el tipo:
array(1..10, record ((direccin x integer) x (lexema x array(1..15,char)))
o: array(1..10, Tipo_Fila)
Expresiones de tipos IV
d)
Punteros
Si T es una expresin de tipo, Pointer (T) es una expresin de tipo que
es un puntero a un objeto de tipo T. Ej.:
Var p: ^fila;
p es de tipo: pointer (fila)
e)
Funciones
Si T1 y T2 son expresiones de tipos, entonces T1 T2 es la expresin
de tipos de una funcin que toma argumentos de T1 y los
transforma en T2
Function f (a, b : Char) : ^Integer;
f tiene el tipo: (char x char) pointer (Integer)
Representacin de tipos
En el lenguaje que implementa el compilador
Representacin en rbol
x
char
pointer
char
Integer
pointer
char
Integer
Representacin de tipos
Ejemplo representacin constructores de tipos
typedef struct{
char nombre[20];
char apellido[20];
int edad;} TipoPersona;
TipoPersona
x
x
x
nombre
x
array
apellido
x
array
0..19 char
edad
int
0..19 char
Representacin no cclica
Nodo = record
x
dato integer
siguiente pointer
Nodo
Representacin cclica
Nodo = record
x
x
Representacin de tipos
Representacin tabular
Si se definen tipos nuevos, preciso TS para aadirlos
Ej.:
int a;
float **b;
float *c[10]
int f(char,float,int);
Tabla Tipos
Nm
.
Tabla Smbolos
Id.
Tipo
Tipo
Tam/
Tipo1
Tipo
Base
entero
real
caracter
puntero
puntero
3
3
array
10
pr. cart.
pr. cart.
funcin
Representacin de tipos
Tipos declarados y tipos annimos
struct{
char nombre[20];
char apellido[20];
int edad;} e1;
char[20] n1;
typedef struct{
char nombre[20];
char apellido[20];
int edad;} tipoPersona;
typedef char[20] cadena;
tipoPersona e2;
cadena n2;
Tipos annimos
Tipos declarados
x
x
x
nombre
x
array
apellido
0..19 char
x
array
edad
int
0..19 char
Sistemas de tipos
Sistema de tipos: conjunto de reglas para asignar
expresiones de tipos a construcciones de un
programa
Tablas de Smbolos I
Recogen las diferentes declaraciones (explcitas) del
programa
Tablas de Smbolos II
Estructura de Datos para almacenar identificadores
definidos en el programa
Identificador
aux
Hashing
ndices
Registros
Lista elementos
0
1
temp
aux
N-1
NOMBRE
a
b
c
d
e
f
TIPO
TAMAO
DIRECCIN
Entero
100
Entero
104
Real
112
Real
120
Caracter
121
Caracter
122
insertar)
El uso de una variable, es el esperado segn su tipo (buscar)
Tablas de Smbolos IV
Gestin de mbitos en la tabla se smbolos
10
Tablas de Smbolos V
Tablas para estructuras registro
};
Tabla
Tipos
cplx a, b;
Tabla Smbolos
Id.
Tipo
direccin
100
116
base de cplx
desplaz. campo imag
Nm
.
Tipo
Tam/
Tipo1
real
pr. cart.
Tipo
Base
0
Tabla Registros
Nombre
Tipo
direccin
real
imag
Un Comprobador de Tipos
Sencillo
Un lenguaje sencillo
Comprobacin de tipos en expresiones
Comprobacin de tipos en proposiciones
Comprobacin de tipos de funciones
11
Un lenguaje sencillo I
Ejemplo de lenguaje, con todos los identificadores
declarados antes de uso
Tipos bsicos
Char
Integer
Error_Tipo
Tipos complejos
Array[n] of T es de tipo array (T, 1..n)
^T es de tipo pointer (T)
Un lenguaje sencillo II
Gramtica del lenguaje
PP
Ds
Ds EE
Ds
Ds DD ;; Ds
Ds ||
DD
id
id :: TT
TT
char
char || integer
integer || array
array [num]
[num] of
of TT || ^T
^T
EE
literal
|
num
|
id
|
E
mod
E
|
E
[
E
]
literal | num | id | E mod E | E [ E ] || E^
E^
D es cada declaracin
T es el tipo
E es la expresin
12
D
Ds D;;Ds
Ds
Ds
Ds
DD
idid::TT
TT
char
char
TT
integer
integer
TT0
^T
0 ^T11
TT0
array [num] of T
0 array [num] of T11
{{aadeTipo
aadeTipo(id.entrada,
(id.entrada,T.tipo)
T.tipo)}}
{{T.tipo
:=
char
}
T.tipo := char }
{{T.tipo
T.tipo:=
:=integer
integer}}
{{TT0.tipo
:=
pointer (T1.tipo)
}
0.tipo := pointer (T
1.tipo) }
{{TT0.tipo
:=
array(1..num.val,
0.tipo := array(1..num.val,
}
TT1.tipo)
1.tipo) }
Un lenguaje sencillo IV
Acciones semnticas de verificacin de tipos en
expresiones
Constantes
{{E.tipo
E.tipo:=
:=Char
Char}}
{{E.tipo
:=
Integer
E.tipo := Integer}}
EE
literal
literal
EE
num
num
Identificadores
{{E.tipo
E.tipo:=
:=buscaTipo
buscaTipo(id.entrada)
(id.entrada)}}
EE
idid
Operadores
EE
EEmod
modEE
{{ifif (E
.tipo==Integer)
Integer)and
and
(E11.tipo
(E
.tipo==Integer)
Integer)
(E22.tipo
= Integer
EE0.tipo
0.tipo = Integer
else
elseEE00.tipo
.tipo==Error_Tipo
Error_Tipo}}
13
Un lenguaje sencillo V
Acciones semnticas de verificacin de tipos en
expresiones
Arrays
EE
EE[[EE]]
{{ifif (E
(E11.tipo
.tipo==Integer)
Integer)and
and
(E
.tipo
=
array(s,
2
(E2.tipo = array(s,t)t)
))
=
t
EE0.tipo
0.tipo = t
else
elseEE00.tipo
.tipo==Error_Tipo
Error_Tipo}}
Punteros
EE
EE^^
{{ifif (E
.tipo==pointer(t))
pointer(t))
(E11.tipo
=t
EE0.tipo
0.tipo = t
else
elseEE00.tipo
.tipo==Error_Tipo
Error_Tipo}}
TS
cpa
D
id :
(a)
array [
T
num
(10)
cpa
of
cp
char
14
TS
cpa
S
id
(b)
cp
id
(a)
]
n
E
num
(1)
mod E
num
(1)
Tipos en sentencias
Por defecto, una sentencia es de tipo nulo (vaco),
salvo si es errnea
Proposiciones if y while
SS
idid:=
:=EE
{{ifif(id.tipo
(id.tipo==E.tipo)
E.tipo)then
thenSS00.tipo
.tipo==vaco
vaco
else
.tipo:=
:=Error_Tipo
Error_Tipo}}
elseSS00.tipo
SS
ififEEthen
thenSS
{{ifif(E.tipo
(E.tipo==boolean)
boolean)then
thenS.tipo
S.tipo==SS11.tipo
.tipo
else
elseSS00.tipo
.tipo:=
:=Error_Tipo
Error_Tipo}}
SS
while
whileEEdo
doSS {{ifif(E.tipo
(E.tipo==boolean)
boolean)then
thenS.tipo
S.tipo==SS11.tipo
.tipo
else
S
.tipo
:=
Error_Tipo
else S00.tipo := Error_Tipo}}
SS
SS ;;SS
{{ifif(S
(S11.tipo
.tipo==vaco)
vaco) and
and(S
(S22.tipo
.tipo==vaco)
vaco)
.tipo
=
vaco
then
S
then S00.tipo = vaco
else
elseSS00.tipo
.tipo:=
:=Error_Tipo
Error_Tipo}}
15
Tipos en sentencias
{{TT0.tipo
= T .tipo T .tipo }
0.tipo = T11.tipo T22.tipo }
tipo devolucin
{{ifif(E
.tipo==s)
s) and
and(E
(E11.tipo
.tipo==st)
st)
(E22.tipo
.tipo
=
t
then
E
then E00.tipo = t
else
elseEE00.tipo
.tipo:=
:=Error_Tipo
Error_Tipo}}
Conversiones de tipos
Algunos operadores pueden aplicarse a operandos de
distintos tipos (promocin o coercin):
x + y
?
Si el tipo de x es double y el de y int, tipo
resultado? (afecta al cdigo a generar)
EE
EEop
opEE
{{ifif(E
(E11.tipo
.tipo==Integer)
Integer)and
and
(E
(E22.tipo
.tipo==Integer)
Integer)then
thenEE00.tipo
.tipo==Integer
Integer
else
if
(E
.tipo
=
Integer)
and
else if (E11.tipo = Integer) and
(E
.tipo==real)
real)then
thenEE00.tipo
.tipo==real
real
(E22.tipo
else
elseifif (E
(E11.tipo
.tipo==real)
real)and
and
(E
.tipo==Integer)
Integer)then
thenEE00.tipo
.tipo==real
real
(E22.tipo
else
if
(E
.tipo
=
real)
and
1
else if (E1.tipo = real) and
(E
.tipo==real)
real)then
thenEE00.tipo
.tipo==real
real
(E22.tipo
else
E
.tipo
=
tipo_error}
else E00.tipo = tipo_error}
16
Tipos sobrecargados I
Algunos operadores y funciones pueden tener
distintos significado segn su contexto:
As:
integer
real
Tipos sobrecargados II
de posibles tipos
Ejemplo DDS
EE
EE
EE
idid
{{E.tipos=E.tipos}
E.tipos=E.tipos}
{{E.tipos=consulta(id.entrada)}
E.tipos=consulta(id.entrada)}
EE
EE((EE))
{E
{E00.tipos=
.tipos={t
{t||existe
existeun
un tipo
tipossen
en EE22.tipos
.tipos
tal
talque
ques
st,t,con
contten
enEE11.tipos}
.tipos}
17
EE
EE
{{E.tipos:=E.tipos
E.tipos:=E.tipos
E.unico:=
E.unico:=ififE.tipos={t}
E.tipos={t}then
thentt
else
tipo_error}
else tipo_error}
{{E.tipos:=consulta(id.entrada)}
E.tipos:=consulta(id.entrada)}
EE
idid
E1 ((EE2 ))
EE0
0 E
1
2
{E
{E00.tipos:=
.tipos:={s
{s||existe
existeun
un tipo
tipossen
en
tal
que
ss
est
en E1.tipos
EE2.tipos
2.tipos tal que ss est en E
1.tipos
t=E
t=E00.unico
.unico
S=
S={s
{stal
talque
quessen
enEE22.tipos
.tiposyyss
tten
enEE11.tipos}
.tipos}
EE2.unico:=if
S==
{s}
then
{s},
else
tipo_error
.unico:=if
S==
{s}
then
{s},
else
tipo_error
2
EE1.unico:=if
.unico:=ifS==
S=={s}
{s}then
thenss
t,t,else
elsetipo_error
tipo_error}}
1
Tipos sobrecargados IV
*, + sobrecargados:
int x int int
real x real real
cplx x cplx cplx
Ej.:
a: cplx;
a=3 + 4 * 1.2
id :
(a)
atributos: tipos,
unico ?
D
T
cplx
id = E
(a)
E+ E
(3)
E * E
(4)
(1.2)
18
real
real
S::=E
E::=E / E
| num
| num.num
Sentencia: 5/2/1.0
Resultado: 2.5
No en Java/C (2.0)
2.5
cierto
E
v=2.5
cierto
/
E
v=2.5
falso
E
v=1.0
cierto
num . num
v=1.0
/ E
E
v=5.0
v=2.0
1.0
falso
falso
num num
v=5
v=2
2
5
real
real
Equivalencia de tipos
Aspecto esencial en las verificaciones semnticas
Dos posibilidades bsicas:
La
Laequivalencia
equivalenciade
denombres
nombresconsidera
consideracada
cadanombre
nombrede
deun
untipo
tipo
como
comoun
untipo
tipodistinto,
distinto,de
demodo
modoque
quedos
dosexpresiones
expresionesde
detipo
tipo
tienes
tienesequivalencia
equivalenciade
denombres
nombressisiyyslo
slosisison
sonidnticas
idnticas
Con
Conlalaequivalencia
equivalenciaestructural,
estructural,los
losnombres
nombresse
sesustituyen
sustituyenpor
porlas
las
expresiones
de
tipos
que
definen.
Dos
expresiones
de
tipos
expresiones de tipos que definen. Dos expresiones de tiposson
son
estructuralmente
estructuralmenteequivalentes
equivalentessisiyyson
sonidnticas
idnticasalalsustituidos
sustituidoslos
los
tipos
por
sus
expresiones
de
tipo
correspondientes
tipos por sus expresiones de tipo correspondientes
19
Equivalencia estructural I
Dos expresiones de tipos son estructuralmente
equivalentes si son el mismo tipo bsico o se forman
aplicando el mismo constructor de tipos a
expresiones de tipos estructuralmente equivalentes
Equivalencia estructural II
Algoritmo para comprobar la equivalencia estructural:
Function
FunctionEquivale
Equivale(s,
(s,t)t)::boolean
boolean
ififssyyttson
del
mismo
son del mismotipo
tipobsico
bsicothen
thenreturn
returntrue
true
else
if
s
=
array(s
,
s
)
and
t
=
array
(t
then
else if s = array(s11, s22) and t = array (t11,,tt22))then
return
returnEquivale
Equivale(s
(s11,,tt11))and
andEquivale
Equivale(s
(s22,,tt22))
else
if
s
=
s
x
s
and
t
=
t
x
t
then
else if s = s11 x s22 and t = t11 x t22 then
return
returnEquivale
Equivale(s
(s11,,tt11))and
andEquivale
Equivale(s
(s22,,tt22))
else
if
s
=
pointer
(s
)
and
t
=
pointer
(t
)
else if s = pointer (s11) and t = pointer (t11)then
then
return
returnEquivale
Equivale(s
(s11,,tt11))
else
elseififss==ss11
ss22and
andtt==tt11
tt22then
then
,
t
)
and
return
Equivale
(s
Equivale(s
(s22,,tt22))
return Equivale (s11, t11) andEquivale
else
return
false
else return false
20
depende de la implementacin
t1=pointer to real
t2=array[10] of int
t3=record
x:t1
y:t2
end
Equivalencia de nombres
Algoritmo para comprobar la equivalencia de
nombres:
Function
FunctionEquivale
Equivale(s,
(s,t)t)::boolean
boolean
ififssyyttson
del
mismo
son del mismotipo
tipobsico
bsicothen
thenreturn
returntrue
true
else
if
s
y
t
son
nombres
de
tipo
else if s y t son nombres de tipo
ififson
soniguales
igualesreturn
returntrue
true
else
return
false
else return false
21
Equivalencia de nombres
Solucin ms comn en lenguajes imperativos
typedef struct{
char nombre[20];
char apellido[20];
int edad;} cliente;
void registrar (cliente*p){...}
empleado e;
registrar(&e); //error
typedef struct{
char nombre[20];
char apellido[20];
int edad;} empleado;
x
x
x
nombre
x
array
0..19
char
apellido
x
array
0..19
edad
int
char
22