Sie sind auf Seite 1von 66

Compiladores

Anlisis Semntico y Chequeo


de Tipos
Oscar Bonilla 2 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 3 Universidad Galileo
Dnde estamos?
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token Stream
Arbol de Parseo
Programa (character stream)
Oscar Bonilla 4 Universidad Galileo
Dnde estamos?
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token Stream
Arbol de Parseo
Programa (character stream)
Analizador Semntico
Generador de Cdigo Intermedio
Representacin Intermedia +
Tabla de Smbolos
Oscar Bonilla 5 Universidad Galileo
Qu es la semntica de un programa?
Sintxis
Cmo se ve un programa
Representacin textual o estructura
Es posible dar una definicin matemtica precisa

Semntica
Cul es el significado del programa
Es ms difcil dar una definicin matemtica precisa
Oscar Bonilla 6 Universidad Galileo
Por qu hacer anlisis semntico
Asegurarnos que el programa cumple con la
definicin del lenguaje de programacin
Proveer mensajes de error tiles al usuario
Oscar Bonilla 7 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 8 Universidad Galileo
Tabla de Smbolos
Un lugar para guardar toda la informacin
adicional acerca del programa
Representaciones intermedias: expresiones,
statements, control de flujo, etc.
Tabla de Smbolos: Tipos, variables, scope, etc.
Oscar Bonilla 9 Universidad Galileo
Scope
Un nombre puede tener significados distintos
en lugares distintos
Tipos, variables, etc tiene scope (mbito)
Tenemos que mantener una tabla de smbolos
para cada scope
Oscar Bonilla 10 Universidad Galileo
Operaciones en la tabla de smbolos
make_table(parent_table) symbol_table
scope(id) symbol_table
lookup_variable(id, symbol_table) variable
lookup_type(id, symbol_table) type
get_type(variable) type
add_type(id, symbol_table, type) type
add_variable(id, symbol_table, type) variable

Oscar Bonilla 11 Universidad Galileo
Siguiente Clase
Todo acerca de tablas de smbolos
Scopes y visibilidad
Informacin que se mantiene en la tabla de
smbolos
Implementacin de tablas de smbolos
Oscar Bonilla 12 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 13 Universidad Galileo
Chequeo Semntico
Chequeos estticos vs. Chequeos dinmicos
Chequeos estticos
Chequeos de control de flujo
Chequeos de unicidad
Chequeos de Tipo
Oscar Bonilla 14 Universidad Galileo
Chequeos de Control de Flujo
El control de flujo del programa es sensitivo
al contexto
Ejemplos:
Declaracin de una variable debe ser visible al
usarla (en scope)
Declaracin de una variable debe estar ntes de
usarla
Cada camino de salida (exit path) retorna un valor
del tipo correcto
Qu ms?
Oscar Bonilla 15 Universidad Galileo
Chequeos de Unicidad
Uso (y mal uso) de identificadores
No se puede representar en una CFG (mismo token)
Ejemplos:
Ningn identificador puede ser usado para dos
definiciones diferentes en el mismo scope
Oscar Bonilla 16 Universidad Galileo
Chequeos de Tipo
Los chequeos semnticos ms extensos
Ejemplos:
Que el nmero de argumentos haga match con el nmero de
parmetros formales y que los tipos correspondientes sean
equivalentes
Si se llama como expresin, debe retornar un tipo
Cada acceso a una variable debe hacer match con la declaracin
(arreglo, estructura, etc.)
Los identificadores en una expresin deben ser evaluables
LHS de una asignacin debe ser asignable
En una expresin los tipos de las variables, tipos de retorno de
mtodos y de operadores deben ser compatibles
Oscar Bonilla 17 Universidad Galileo
Chequeos Dinmicos
Chequeos de lmites de arreglos
Chequeo de dereferencia del Null Pointer
Oscar Bonilla 18 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 19 Universidad Galileo
Sistemas de Tipos
Un sistema de tipos es usado para el chequeo de
tipos
Un sistema de tipos incorpora
Construcciones estticas del lenguaje
Nocin de tipos
Reglas para asignar tipos a construcciones del
lenguaje
Oscar Bonilla 20 Universidad Galileo
Expresiones de Tipos
Un tipo compuesto es denotado por una
expresin de tipo
Una expresin de tipo es
Un tipo bsico
La aplicacin de un constructor de tipo a otras
expresiones de tipo
Oscar Bonilla 21 Universidad Galileo
Expresiones de Tipos: Tipos Bsicos
Tipos atmicos definidos por el lenguaje
Ejemplos:
Enteros
Booleanos
floats
caracteres
type_error
Tipo especial que produce un error
void
Tipo bsico que denota la ausencia de un valor
Oscar Bonilla 22 Universidad Galileo
Expresiones de Tipo: Nombres
Ya que las expresiones de tipos pueden ser
nombradas, un nombre de tipo es una expresin
de tipo
Oscar Bonilla 23 Universidad Galileo
Expresiones de Tipo: Productos
Si T
1
y T
2
son expresiones de tipo, T
1
T
2
es
tambin una expresin de tipo

Oscar Bonilla 24 Universidad Galileo
Expresiones de Tipo: Arrays
Si T es una expresin de tipo, un array(T, I) es
tambin una expresin de tipo
I es una constante entera que denota el nmero de
elementos de tipo T
Ejemplo:
int foo[128];
array(integer, 128)

Oscar Bonilla 25 Universidad Galileo
Expresiones de Tipo: Function Calls
Matemticamente una funcin mapea
Elementos de un conjunto (el dominio)
A elementos de otro conjunto (el contradominio)
Ejemplo
int foobar(int a, boolean b, int c)
integer boolean integer integer
Oscar Bonilla 26 Universidad Galileo
Expresiones de Tipo: Otras
Records
Estructuras y clases
Ejemplo
class { int i; int j;}
integer integer
Lenguajes Funcionales
Funciones que toman funciones y retornan
funciones
Ejemplo
(integer integer) integer (integer integer)


Oscar Bonilla 27 Universidad Galileo
Un lenguaje simple con tipos
Un lenguaje que tiene una secuencia de
declaraciones seguidas de una sola expresin
P D; E
D D; D | id : T
T char | integer | array [ num ] of T
E literal | num | id | E + E | E [ E ]
Programa Ejemplo
var: integer;
var + 1023
Oscar Bonilla 28 Universidad Galileo
Un lenguaje simple con tipos
Un lenguaje que tiene una secuencia de
declaraciones seguidas de una sola expresin
P D; E
D D; D | id : T
T char | integer | array [ num ] of T
E literal | num | id | E + E | E [ E ]
Cules son las acciones del parser para este
lenguaje?
Oscar Bonilla 29 Universidad Galileo
Acciones del Parser
P D; E
D D; D
D id : T { addtype(id.entry, T.type); }
T char { T.type = char; }
T integer { T.type = integer; }
T array [ num ] of T
1

{ T.type = array(T
1
.type, num.val); }
Oscar Bonilla 30 Universidad Galileo
Acciones del Parser
E literal { E.type = char; }
E num { E.type = integer; }
E id { E.type = lookup_type(id.name); }
Oscar Bonilla 31 Universidad Galileo
Acciones del Parser
E E
1
+ E
2
{ if E
1
.type == integer and
E
2
.type == integer then
E.type = integer
else
E.type = type_error
}
24
Oscar Bonilla 32 Universidad Galileo
Acciones del Parser
E E
1
[E
2
] { if E
2
.type == integer and
E
1
.type == array(s, t) then
E.type = s
else
E.type = type_error
}

Oscar Bonilla 33 Universidad Galileo
Equivalencia de Tipos
Cmo sabemos si dos tipos son iguales?
Mismo entrada de tipo
Ejemplo:
int A[128];
foo(A);

foo(int B[128]) { }
Dos entradas de tipo distintas en dos tablas de smbolos
distintas
Pero deberan ser iguales
Oscar Bonilla 34 Universidad Galileo
Equivalencia Estructural
Si la expresin de tipo de dos tipos tiene la
misma construccin, entonces son equivalentes
Misma Construccin
Tipos base equivalentes
Mismo conjunto de constructores de tipo son
aplicados en el mismo orden (e.d. rbol de tipos
equivalente)


Oscar Bonilla 35 Universidad Galileo
Coercin de Tipos
Conversin implcita de un tipo a otro tipo
Ejemplo
int A;
float B;
B = B + A
Dos tipos de coercin
widening conversions
narrowing conversions


Oscar Bonilla 36 Universidad Galileo
Widening conversions
Conversiones sin prdida de informacin
Ejemplos:
integers a floats
shorts a longs
Oscar Bonilla 37 Universidad Galileo
Narrowing conversions
Conversiones que pueden perder informacin
Ejemplos:
integers a chars
longs a shorts
Raro en lenguajes
Oscar Bonilla 38 Universidad Galileo
Type casting
Conversin explcita de un tipo a otro
Tanto widening como narrowing
Ejemplo
int A;
float B;
A = A + (int)B
Typecasting ilimitado puede ser peligroso
Oscar Bonilla 39 Universidad Galileo
Pregunta:
Podemos asignarle un solo tipo a todas las
variables, funciones y operadores?
Qu hay de +, cul es su tipo?
Oscar Bonilla 40 Universidad Galileo
Overloading
Algunos operadores pueden tener ms de un tipo.
Ejemplo
int A, B, C;
float X, Y, Z;
A = A + B
X = X + Y
Complica el sistema de tipos
Ejemplo
A = A + X
Cul es el tipo de + ?
Oscar Bonilla 41 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 42 Universidad Galileo
Clases
Una clase es un tipo de datos abstracto
Contiene
Datos (campos)
Acciones (mtodos)
Restricciones de acceso
Cada instancia de una clase va a crear un objeto
separado
Con su propia copia de las variables instanciadas
(compos)
Comparte las acciones (mtodos)
Oscar Bonilla 43 Universidad Galileo
Clase Ejemplo
class vehicle {
int num_wheels;
void print_num_wheels( ) { }
}
campo
mtodo
vehicle A;
A.print_num_wheels( )
El Objeto es un parmetro implcito de la llamada del mtodo
Oscar Bonilla 44 Universidad Galileo
Herencia
Extiende las clases al permitirles relaciones de
supertipo/subtipo

Soporta reuso de cdigo incremental
Partes comnes en un supertipo comn
Diferencias individuales en cada subtipo
Oscar Bonilla 45 Universidad Galileo
Ejemplo de Herencia
class SUV extends vehicle {
int rollover_speed;
int get_rollover_speed( ) { }
void print_rollover_speed( ) { }
}

La clase SUV es una subclase de la clase vehicle
La clase vehicle es una superclase de la clase SUV
Una instancia (objeto) de la clase SUV contiene
Todos los campos de la clase vehicle
Todos los campos de la clase SUV
Los mtodos tanto en SUV como en vehicle son
visibles a la clase SUV
Oscar Bonilla 46 Universidad Galileo
Herencia
Herencia Sencilla
Cuando cada clase est restringida a tener una sola
superclase inmediata (mximo)

Herencia Mltiple
Cuando cada clase puede tener ms de una
superclase inmediata
Oscar Bonilla 47 Universidad Galileo
Jerarqua de Herencia
La relacin subclase/superclase
Definida por los extends
Puede ser modelada mediante un grafo acclico
dirigido (DAG)
Oscar Bonilla 48 Universidad Galileo
Jerarqua de Herencia
Car es un hijo de vehicle (subclase inmediata)
Vehicle es un padre de SUV (superclase inmediata)
4wd es un descendiente de vehicle (subclase)
Vehicle es un ancestro de 2-door (superclase)
vehicle
SUV car motorbike
4wd 2wd 4-door 2-door 5-door
Oscar Bonilla 49 Universidad Galileo
Reglas de Control de Acceso
Conjunto de tipos de control de acceso usados
por un lenguaje OO genrico (e.d. Espresso)
Visibilidad en scope
Acceso a datos
Acceso a mtodos pblicos
Acceso a mtodos privados

Muchos lenguajes OO tienen controles de
acceso ms complicados

Oscar Bonilla 50 Universidad Galileo
Visibilidad en Scope
Las variables y los campos de una clase pueden ser
declarados en cualquier parte en el programa en la que
se permita una declaracin y la definicin de la clase
est visible

Si un campo en una subclase y superclase usa el
mismo nombre
La resolucin de nombres se hace usando reglas de scope
Se trata el scope de la subclase dentro del scope de la
superclase
Oscar Bonilla 51 Universidad Galileo
Acceso a Datos
Los campos de datos de una clase slo pueden
ser accesados por los mtodos definidos en esa
clase
Una variacin ms permisiva:
Todos los mtodos de las subclases pueden accesar
los campos en la superclase
Oscar Bonilla 52 Universidad Galileo
Acceso a mtodos pblicos
Todos los mtodos pblicos de una clase
pueden ser invocados por cualquier mtodo que
pueda declarar una variable o un campo del tipo
de la clase
Oscar Bonilla 53 Universidad Galileo
Acceso a mtodos privados
Los mtodos privados de una clase slo pueden
ser invocados por:
Los mtodos de esa clase
Los mtodos de cualquier clase que sea
descendiente de la clase
Oscar Bonilla 54 Universidad Galileo
Ejemplo: control de acceso de C++
Una clase puede ser friend de otra clase
Los mtodos y campos pueden ser
private: visibles a funciones miembro y friends
protected: visibles a funciones miembro, friends, y
clases derivadas (y sus friends)
public: pueden ser usados por cualquier funcin
Oscar Bonilla 55 Universidad Galileo
Conversin automtica de tipos
Una expresin de una clase es coercionada a
una clase ancestro cuando se requiera
Pero no al revs
Llamado up-casting
Siempre legal porque la subclase contiene todos los
campos de la superclase
Down-casting
Esto es ms permisivo
Conversin explcita de una clase ancestro a una
clase descendiente
Slo tiene sentido si el objeto fue creado
inicialmente como en la subclase, pero despus
convertido a la superclase
No puede chequearse en tiempo de compilacin
Oscar Bonilla 56 Universidad Galileo
Mtodos Estticos vs. Dinmicos
Consecuencia de up-casting
Implementacin del mtodo declarado en una superclase
puede ser desconocida al momento de compilar
El mtodo es sobreescrito en una subclase
Variaciones de Lenguajes
Todos los mtodos no declarados estticos pueden ser up-casted
Slo los mtodos declarados virtuales pueden ser up-casted
Anlisis e implementacin de mtodos dinmicos
No se puede efectuar ningn chequeo semntico
Necesitamos soporte en tiempo de corrida (runtime) al generar el
cdigo
Oscar Bonilla 57 Universidad Galileo
Herencia vs. Agregacin
Una clase T2 es una agregacin de una clase T1
si T2 contiene uno o ms campos de tipo T1
A diferencia de la herencia, T2 no puede accesar
campos o mtodos privados en T1

Cundo heredear y cundo agregar?
heredar: T2 es un T1
agregar: T2 tiene un T1
Oscar Bonilla 58 Universidad Galileo
Ejemplo: Herencia vs. Agregacin
SUV es un vehculo
SUV tiene un motor

class vehiculo {

}

class SUV extends vehiculo {
motor power_plant;

}

Oscar Bonilla 59 Universidad Galileo
Herencia mltiple
Permite que una clase sea una extensin de
mltiples clases
Lleva a semnticas ms complicadas para subtipos
Oscar Bonilla 60 Universidad Galileo
Ejemplo de Herencia Mltiple
class vehicle {

}

class yuppie_toys {

}

class SUV extends vehicle, yuppie_toys {

}
Oscar Bonilla 61 Universidad Galileo
Jerarqua de Herencia Mltiple
Jerarqua de Herencia Mltiple es un DAG
Pregunta: S tanto yuppie_toys como vehicle tienen un mtodo
price() cundo SUV invoque a price, qu mtodo se invoca?
vehicle
SUV car motorbike
4wd 2wd 4-door 2-door 5-door
toys
yuppie_toy teen_toy
Oscar Bonilla 62 Universidad Galileo
Jerarqua de Herencia Mltiple
Es todava ms complicado cundo hay un ancestro
comn
Pregunta: Cuntas instancias de bti van a ser incluidas en
la clase SUV?
vehicle
SUV car motorbike
4wd 2wd 4-door 2-door 5-door
toys
yuppie_toy teen_toy
big_ticket_items
Oscar Bonilla 63 Universidad Galileo
Resumen
Introduccin
Tablas de Smbolos
Chequeo Semntico
Chequeo de Tipos
Semntica de un Programa Orientado a Objetos
Tipos Polimrficos

Oscar Bonilla 64 Universidad Galileo
Qu es un tipo polimrfico?
Procedimientos ordinarios permiten que el
cuerpo sea ejecutado con argumentos de tipo
fijo
Cada llamada a un procedimiento polimrfico
ejecuta el cuerpo con el tipo de los argumentos
Beneficios del polimorfismo
Reuso de Cdigo
Ejemplo
El mismo procedimiento puede aplicarse a una lista de
enteros o a una lista de strings
Oscar Bonilla 65 Universidad Galileo
Polimorfismo Paramtrico
Los procedimientos tienen tipos paramtrizados
Instanciamos el procedimiento con un tipo
determinado de datos
Templates en C++
Ejemplo:
template<class T> class linked_list_elem {
T elem; linked_list_elem * next;
...
}
lined_list_elem<int> integer_list;
lined_list_elem<foo> foo_list;
Oscar Bonilla 66 Universidad Galileo
Lecturas
Tigre
6.1, Captulos 7 y 8
Ballena
4.1, 4.2, 4.3, 4.4, 4.5
Dragn
Captulo 8

Das könnte Ihnen auch gefallen