Está en la página 1de 22

Comprobacin de tipos.

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

Especificacin de un comprobador de tipos


sencillo

Conversiones y sobrecarga de tipos

Equivalencia de expresiones de tipos

Comprobacin de tipos. Procesadores de


Lenguaje II

Comprobacin de Tipos
Un comprobador de tipos

Calcula y mantiene la informaci


informacin de tipos (inferencia)
Comprueba que el tipo de una construcci
construccin tenga sentido en
su contexto seg
segn el lenguaje

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Ejemplo Comprobacin de Tipos


Ej. 1:Tipos para not false && 1 < 2 * 3
&& : boolean
not : boolean

< : boolean
* : int

false : boolean 1 : int

3 : int

2 : int

Comprobacin de tipos. Procesadores de


Lenguaje II

Ejemplo Comprobacin de Tipos


Ej. 2:Tipos para if (a=b) x=1; (error en
Java, no en C)
S

: error

if (E) then S
= : int

= : int
a : int

b : int1

x : int

1 : int

Es una aplicacin de evaluacin de gramtica


atribuida

No siempre es tan sencillo

Comprobacin de tipos. Procesadores de


Lenguaje II

Comprobacin de Tipos
Un lenguaje especifica que operaciones son vlidas
para cada tipo

Formalizacin de reglas semnticas de verificacin

Se detectan errores

Acceso incorrecto a memoria:


Lmites de abstraccin, mal uso de estructuras, etc.

Tipos de lenguajes:

Estticamente tipificados: La mayora de comprobaciones se

realizan en tiempo de compilacin (C, Java)


Dinmicamente tipificados: La mayora de comprobaciones
en ejecucin (Scheme, LISP)
No tipificados: Ninguna comprobacin (cdigo ensamblador)

Comprobacin de tipos. Procesadores de


Lenguaje II

Expresiones de tipos I
Representan el tipo de las construcciones

Valores posibles y operaciones que pueden


aplicarse
Especificaciones del lenguaje para operaciones:

Tipo de Expresin resultante de aplicar operadores aritmticos


Resultado de aplicar operador &
Tipo de llamada a funcin

Las clases en POO son una extensin

Pueden ser

Un tipo bsico

Un constructor de tipos aplicado a expresiones de tipos

Boolean, Char, Integer, Real, Vacio, Error_tipo,


array de variables de tipo bsico, puntero a variable, registro,

Comprobacin de tipos. Procesadores de


Lenguaje II

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)

Comprobacin de tipos. Procesadores de


Lenguaje II

Expresiones de tipos III


c)

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)

Comprobacin de tipos. Procesadores de


Lenguaje II

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)

Comprobacin de tipos. Procesadores de


Lenguaje II

Representacin de tipos
En el lenguaje que implementa el compilador

Estructura especial de tabla de smbolos

Representaciones de expresiones de tipos

Representacin en rbol
x
char

pointer
char

Integer

Representacin en Grafo dirigido acclico

pointer

char

Integer

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Ciclos en la representacin de tipos


Representaciones recursivas

Representacin no cclica

Nodo = record
x

dato integer

siguiente pointer
Nodo

Representacin cclica

Nodo = record
x
x

dato integer siguiente pointer

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Sistemas de tipos
Sistema de tipos: conjunto de reglas para asignar
expresiones de tipos a construcciones de un
programa

Un comprobador de tipos implanta un sistema de tipos


Se pueden implementar en la definicin dirigida por la sintaxis
VAR x: RECORD
p_real: real;
p_imag: real;
END;
VAR y: RECORD
p_imag: real;
p_real: real;
END;
x=y;
INCORRECTO
x.p_real=y.p_imag; CORRECTO

Comprobacin del sistema de tipos

Esttica: Aquella que es realizada por el compilador antes de la


ejecucin del programa
Dinmica: Aquella que es realizada al ejecutar el programa objeto

Comprobacin de tipos. Procesadores de


Lenguaje II

Comprobacin esttica y dinmica


Sistema de tipos seguro (sound type): no necesita comprobar
dinmicamente errores de tipos
Lenguajes fuertemente tipificados: garantizan que los programas
que aceptan se ejecutarn sin errores de tipo
Algunas comprobaciones slo pueden ser dinmicas:
Tabla: array[0..255] of Char;
i: Integer;
<< se asigna valor a i >>
Tabla [i] := 3;

El compilador no puede garantizar estticamente que el valor de la variable i


no exceda los lmite del array tabla
Polimorfismo en lenguajes OO

Comprobacin de tipos. Procesadores de


Lenguaje II

Tablas de Smbolos I
Recogen las diferentes declaraciones (explcitas) del
programa

Declaraciones de constantes (nombre, tipo, valor,)


const int SIZE=20

Declaraciones de variables (nombre, tipo, direccin,)


Tabla TS;
int var[SIZE];

Declaraciones de funciones (nombre, tipos, direccin,)

Declaraciones de tipos (nombre, tipo, tamao,)

int buscar (int* vector);


typedef struct Tabla{
{char* nombre;
int contador;
Tabla* siguiente;
}

Comprobacin de tipos. Procesadores de


Lenguaje II

Tablas de Smbolos II
Estructura de Datos para almacenar identificadores
definidos en el programa

Se utiliza en diferentes fases del anlisis y sntesis


Funciones de insercin, bsqueda y eliminacin
Solucin habitual con tabla de hash
Optimizacin del compilador

Identificador
aux

Hashing

ndices

Registros

Lista elementos

0
1

temp

aux

N-1

Almacena la informacin de inters: tipo, direccin en


memoria,

Comprobacin de tipos. Procesadores de


Lenguaje II

Tablas de Smbolos III


Ej.:
int a,b;
float c,d;
char e,f;

NOMBRE
a
b
c
d
e
f

TIPO

TAMAO

DIRECCIN

Entero

100

Entero

104

Real

112

Real

120

Caracter

121

Caracter

122

Dos usos en la verificacin semntica


En la declaracin de una variable no hay colisiones (buscar e

insertar)
El uso de una variable, es el esperado segn su tipo (buscar)

Comprobacin de tipos. Procesadores de


Lenguaje II

Tablas de Smbolos IV
Gestin de mbitos en la tabla se smbolos

Los lenguajes con estructura de bloques permiten declaraciones


en distintos mbitos, se puede dar anidamiento
{ int x = 0;
foo(x);
{
int x = 1;
bar(x);
}
baz(x);
}

Idea (variable x declarada en un bloque):

Al aadir la definicin de x en un nuevo mbito, ocultar las


definiciones previas (sin eliminar)
Al salir del bloque, eliminar esta definicin de x y restaurar las
anteriores

Lectura hacia atrs de la tabla

10

Comprobacin de tipos. Procesadores de


Lenguaje II

Tablas de Smbolos V
Tablas para estructuras registro

Los registros tienen campos con desplazamiento fijo

typedef struct cplx{


cplx.real
double real;
cplx.imag
double imag;

};
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

Comprobacin de tipos. Procesadores de


Lenguaje II

Un lenguaje sencillo I
Ejemplo de lenguaje, con todos los identificadores
declarados antes de uso

Objetivo: comprobar el tipo de toda expresin

Tipos del lenguaje

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)

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Un lenguaje sencillo III


Acciones semnticas de construccin de tipos
PP
Ds
DsEE
Ds

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) }

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

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}}

Comprobacin de tipos. Procesadores de


Lenguaje II

Ejemplo Verificacin Tipos


a: array [10] of ^char
b: char
b=a[4 mod 3] ^

TS

cpa

D
id :

(a)
array [

T
num

(10)

cpa

of

cp

char

14

Comprobacin de tipos. Procesadores de


Lenguaje II

Ejemplo Verificacin Tipos


a: array [10] of ^char
b: char
b=a[4 mod 3] ^

TS

cpa

S
id

(b)

cp

id

(a)

]
n

E
num

(1)

mod E
num

(1)

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Tipos en sentencias

Ampliar G para permitir declaracin de funciones


TT
TT
TT
Ej.:

{{TT0.tipo
= T .tipo T .tipo }
0.tipo = T11.tipo T22.tipo }

int f(double x, char y) { ... }


tipo de f: double x char int
tipos argum.

tipo devolucin

Llamada a la funcin, con parmetros


EE
EE((EE))

{{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}}

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Tipos sobrecargados I
Algunos operadores y funciones pueden tener
distintos significado segn su contexto:

(4 + a) y (4+a) son expresiones distintas en Java


No siempre es posible resolver slo con los operandos
cuando hay promocin automtica:
function * (k,j: integer) return integer
function * (x,y: real) return real
Hay sobrecarga en Ada y en C++, no en C y Pascal

* Puede tener los tipos posibles:


integer x integer
integer x integer

As:

integer
real

real x real real


3.1*5 pasa a ser 3.1*(real)5
3*5 es ambiguo: puede ser integer o real: (real)3 * (real) 5
en la expresin 2*(3*5) tiene tipo (i*i) i
en la expresin z*(3*5) tiene tipo (r*r)

Verificaciones de larga distancia

Comprobacin de tipos. Procesadores de


Lenguaje II

Tipos sobrecargados II

Tipado sobrecargado: si permite que las construcciones


tengan ms de un tipo

La sobrecarga permite varias declaracions del mismo nombre


El extremo es una declaracin para cualquier tipo:
Procedure swap(var x,y:anytype): plantilla (template)

Se generalizan las verificaciones para considerar conjuntos


de tipos posibles de una expresin:

Se supone que la tabla de smbolos puede contener el conjunto

de posibles tipos

El tipo conjunto vaco se asimila con tipo_error


Problema similar a la inferencia de 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

Comprobacin de tipos. Procesadores de


Lenguaje II

Tipos sobrecargados III

Algunos lenguajes, como Ada, obligan a que una expresin


finalmente tenga un tipo nico, sino es un error
Se introducen un nuevo atributo: unico

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

Implementacin en dos pasadas para evaluar tipos y


unico

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Evaluacin combinada en dos


pasadas

Ejemplo (promocin en expresiones):

Atributo heredado: tipo


Atributo sintetizado: esReal, valor

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

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

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

integer es equivalente a integer


pointer (integer) es equivalente a pointer (integer)

Las expresiones estructuralmente equivalentes se


corresponden con rboles o grafos acclicos iguales

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Algunas comprobaciones pueden relajarse (arrays)

20

Comprobacin de tipos. Procesadores de


Lenguaje II

Nombres de expresiones de tipos I


Algunos lenguajes permiten nombrar tipos
Type
Typeenlace
enlace==^nodo;
^nodo;
Var
Varsiguiente
siguiente::enlace;
enlace;
ultimo:
ultimo:enlace;
enlace;
pp::^nodo;
^nodo;
q,q,rr::^nodo;
^nodo;

Tienen igual tipo las variables siguiente, ultimo, p, q, r?

depende de la implementacin

Un lenguaje puede forzar el uso de tipos nombrados:


record
x: pointer to real
y:array[10] of int
end

t1=pointer to real
t2=array[10] of int
t3=record
x:t1
y:t2
end

Comprobacin de tipos. Procesadores de


Lenguaje II

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

Comprobacin de tipos. Procesadores de


Lenguaje II

Equivalencia de nombres
Solucin ms comn en lenguajes imperativos

Ms restrictiva, ms fcil de implementar

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

También podría gustarte