Está en la página 1de 21

Mayra Alejandra Escoto Aguirre mattefye-san@hotmail.

com

1.3

COMPROBACIN DE TIPOS EN EXPRESIONES

Tarea clave del Anlisis Semntico, garantiza que el programa tiene sentido. OBJETIVO: Asegurar que el tipo de una construccin del programa coincida con el previsto en sus contexto. Compatibilidad de tipos en las asignaciones Operadores aplicados a datos del tipo adecuado N y tipo correcto en los parmetros de funciones

Adems, se debe considerar: CONVERSIN DE TIPOS (cuando estos sean compatibles) Conversin IMPLCITA (Coerciones) realizada por el compilador Conversin EXPLCITA realizada por el programador SOBRECARGA DE OPERADORES y FUNCIONES POLIMRFICAS Smbolos del lenguaje que tienen asociados distintos tipos y operaciones en funcin del contexto. Ejemplo: Operador +: Suma de enteros Suma de reales Concatenacin de cadenas

Comprobacin de tipos

Un lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se detectarn siempre en tiempo de compilacin. Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintcticas como las semnticas del lenguaje fuente. Como mnimo, ante un error, un comprobador de tipos debe informar de la naturaleza y posicin del error y recuperarse para continuar con la comprobacin del resto del programa a analizar. Esta comprobacin, llamada comprobacin esttica (para distinguirla de la comprobacin dinmica que se realiza durante la ejecucin del programa objeto), garantiza la deteccin y comunicacin de algunas clases de errores de programacin. Los ejemplos de comprobacin esttica incluyen:

1. Comprobaciones de tipos: Un compilador debe informar de un error si se aplica un operador a un operando incompatible; por ejemplo, si se suman una variable tipo matriz y una variable de funcin.

2. Comprobaciones del flujo del control: Las proposiciones que hacen que el flujo del control abandone una construccin deben tener algn lugar a dnde transferir el flujo de control. Por ejemplo, una proposicin break en C hace que el control abandone la proposicin que la engloba, while, for o switch ms cercana; si dicha proposicin englobadora no existe, ocurre un error.

3. Comprobaciones de unicidad. Hay situaciones en que se debe definir un objeto una vez exactamente. Por ejemplo, en Pascal, un identificador debe declararse de forma nica, las etiquetas en una proposicin case deben ser diferentes y no se pueden repetir los elementos en un tipo escalar.

4. Comprobaciones relacionadas con nombres. En ocasiones, el mismo nombre debe aparecer dos o ms veces. Por ejemplo, en Ada, un lazo o bloque puede tener un nombre que aparezca al principio y al final de la construccin. El compilador debe comprobar que se utilice el mismo nombre en ambos sitios.

Un comprobador de tipos se asegura de que el tipo de una construccin coincida con el previsto en su contexto. Por ejemplo, el operador aritmtico predefinido mod en Pascal exige operandos de tipo entero, de modo que un comprobador de tipo debe asegurarse de que los operandos de mod tengan tipo entero.

Cadena

de

Analizador Sintctico

componentes lxicos

rbol sintctico

Comprobador de tipos

rbol sintctico

Generador de cdigo intermedio

representacin intermedia

-Ubicacin de un comprobador de tipos.-

Sistemas de Tipos

El diseo de un comprobador de tipos para un lenguaje se basa en informacin acerca de las construcciones sintcticas del lenguaje, la nocin de tipos y las reglas para asignar tipos a las construcciones de lenguaje. Los siguientes extractos del informe de Pascal y del

manual de referencia de C, respectivamente, son ejemplos de la informacin con la que el diseador de un compilador podra verse obligado a comenzar. "Si ambos operandos de los operadores aritmticos de suma, sustraccin y multiplicacin son de tipo entero, entonces el resultado es de tipo entero." "El resultado del operador unario & es un apuntador haca el objeto al que se refiere el operando. Si el tipo del operando es' .. .', el tipo del resultado es 'apuntador a .. .'."

En pocas palabras, es una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa, que permiten asociar tipos a las construcciones del lenguaje y verificar su correccin.

Determinan el conjunto de expresiones de tipo admisibles en el lenguaje

Un comprobador de tipos implanta un sistema de tipos.

Expresiones de tipo: Tipos asociados a las construcciones del lenguaje. Una expresin de tipo es o bien un tipo bsico, o es el resultado de aplicar un constructor de tipo a otra expresin de tipo de acuerdo a unas reglas de construccin (dadas por el lenguaje).

Un tipo bsico es una expresin de tipo, entre los tipos bsicos se encuentran boolean., char, integer y real. Un tipo bsico especial, error -tipo, sealar un error durante la comprobacin de tipos. Por ltimo, un tipo bsico vaco que indica "la ausencia -de valor", permite que se comprueben las proposiciones. Los tipos bsicos y constructores de tipo dependen del lenguaje. Las expresiones de tipo pueden tener asociados nombres.

Tipos Bsicos: char, boolean, real, integer o Tipos especiales: error: Indica que no se puede asociar una expresin de tipo correcta void: Indica que una construccin del lenguaje es correcta, pero no tiene ningn tipo asociado. til en comprobacin de sentencias Constructores de tipo: Permiten formar tipos complejos a partir de otros ms simples.

Los constructores incluyen: a) MATRICES: Siendo T una expresin de tipo, array(I, T) es el tipo de una matriz con elementos de tipo T e ndices del tipo I.

Si T es una expresin de tipo, entonces array (I, T) es una expresin de tipo que indica el tipo de una matriz con elementos de tipo T y conjunto de ndices I.I es a menudo un rango de enteros. T tipo de los elementos del array I tipo de los ndices (generalmente un rango) Por ejemplo, la declaracin en Pascal: var A: array(1..10) of integer; asocia la expresin de tipo arra.v ( 1..10, integer) con A. b) PRODUCTOS: Si T, y T2 son expresiones de tipo, entonces su producto cartesiano T, x T2 es una expresin de tipo. Se supone que x es asociativa por la izquierda.

c) REGISTROS: La diferencia entre un registro y un producto es que los campos de un registro tienen nombres. El constructor de tipos record se aplicar a una tupla formada con nombres de campos y tipos de campos. (Tcnicamente, los nombres de campos deberan formar parte del constructor de tipos, pero es conveniente que los nombres de los campos estn junto a sus tipos asociados. Un ejemplo de esto: el constructor de tipos record se aplica a un apuntador a una tabla de smbolos que contiene entradas para los nombres de los campos. Ejemplo: struct { char nombre[10]; float altura; } record nombre: array [0..9] of character; altura:real; end; record(nombre : array(0.,9, char) altura : real) d) PUNTEROS: Si T es una expresin de tipo, pointer(T) representa al tipo de dato que tiene como valores el conjunto de posiciones de memoria que pueden almacenar datos del tipo T.

Ejemplo: char p; p:character

pointer(char)

e) FUNCIONES: Matemticamente, una funcin transforma elementos de un conjunto, el dominio, a elementos de otro conjunto, el rango. Se pueden considerar las funciones dentro

de los lenguajes de programacin como transformaciones de un dominio tipo D a un rango tipo R. La expresin de tipo DR indicar el tipo de dicha funcin. Por ejemplo, la funcin predefinida mod de Pascal tiene un dominio de tipo int x int, es decir, un par de enteros, y rango de tipo int. As, se dice que mod tiene el tipo1. En otras palabras, siendo D la expresin de tipo de los argumentos de la funcin y T el tipo del valor devuelto, la expresin de tipo de la funcin ser: D T Para funciones con mltiples argumentos se usarn productos Ejemplo: float f(char a,b); function f(a,b:character):real

(char char) pointer(real)

Otros constructores: conjuntos, pilas, colas, ficheros, etc.

NOTA: Dentro de las expresiones de tipo podrn incluirse variables Representa un componente que puede tener cualquier expresin de tipo asociada o del cual se desconoce su tipo. til para manejar funciones polimrficas. Declaracin y Comprobacin de Tipos

Varemos un ejemplo sencillo del manejo de declaraciones de tipo y de comprobacin de tipos en expresiones, funciones y sentencias. Se usar un lenguaje simplificado: char 4 tipos bsicos boolean integer real

matrices 3 constructores puntero funciones (con 1 argumento)

ATRIBUTOS: tipo: expresin de tipo asociada a un nombre/fragmento de cdigo

(a) DECLARACIN DE TIPOS Decl Decl ; Decl ; Decl " Decl id : Tipo Tipo char Tipo boolean Tipo integer Tipo real Tipo Tipo Tipo array [num] of Tipo { TDS insertar(id.texto, Tipo.tipo)} { Tipo.tipo = char} { Tipo.tipo = boolean} { Tipo.tipo = int} { Tipo.tipo = real} { Tipo0.tipo = pointer(Tipo1.tipo} { Tipo0.tipo = array(1..num.valor, Tipo1.tipo}

(b) COMPROBACIN DE TIPOS EN EXPRESIONES En las siguientes reglas, el atributo sintetizado tipo para E da la expresin de tipo asignada por el sistema de tipos a la expresin generada por E. Las siguientes reglas semnticas sealan que las constantes representadas por los componentes lxicos literal y nm tienen tipo char e integer, respectivamente: E literal E nm

{ E. tipo : = char } { E. tipo : = integer }

Se utiliza la funcin busca(e) para traer el tipo guardado en la entrada de la tabla de smbolos apuntada por e. Cuando un identificador aparece en una expresin, se trae su tipo declarado y se asigna al atributo tipo: E id {E.tipo := busca (id.entrada) } La expresin formada aplicando el operador mod a dos subexpresiones de tipo integer tiene tipo integer, de lo contrario, su tipo es error_tipo. La regla es E E1 mod E2

{E.tipo: = if E1.tipo = integer and E2 .tipo = integer then integer else error _ tipo }

En una referencia a una matriz E1 [E2], la expresin de ndice E2 debe tener tipo entero, en cuyo caso el resultado es el tipo de elemento t obtenido del tipo array (s, t) de E1; no se utiliza el conjunto de ndices s de la matriz.

E E1[E2]

{E.tipo:= if E2.tipo = integer and E1.tipo = array(s, t) then t else error_tipo}

Dentro de las expresiones, el operador postfijo operando. El tipo de E E E1

entrega el objeto apuntado por su

es el tipo t del objeto apuntado por el apuntador E:

{ E.tipo: = if E1.tipo = pointer (t) then t else error_tipo }

Operadores aritmticos y lgicos Exp Exp mod Exp

{ Exp0.tipo = if (Exp1.tipo=integer) and (Exp2.tipo=integer) then integer else error }

Exp Exp == Exp

{ Exp0.tipo = if (Exp1.tipo=integer) and (Exp2.tipo=integer) then boolean else error }

Acceso a matrices y punteros Exp Exp [ Exp ]

{ Exp0.tipo = if (Exp2.tipo=integer) and (Exp1.tipo=array(S, T)) then T else error }

Exp Exp

{ Exp0.tipo = if (Exp1.tipo=pointer(T)) then T else error }

(c) COMPROBACIN DE TIPOS EN LLAMADAS A FUNCIN Exp id( Exp )

{ tipoID = TDS obtenerTipo(id.texto) Exp0.tipo = if (tipoID=S T) and (Exp1.tipo=S) then T else error }

NOTA: Con funciones de ms de un argumento se deberan usar productos.

(d) COMPROBACIN DE TIPOS EN SENTENCIAS NOTA: A las sentencias se les asociar el tipo void si los tipos de las expresiones que contienen son correctos. o Consideraremos: asignaciones, if simple, bucle while y secuencias.

Puesto que las construcciones de los lenguajes, como las proposiciones, carecen tpicamente de valores, se les puede asignar el tipo bsico especial vaco (void). Si se detecta un error dentro de una proposicin, el tipo asignado a la proposicin es error_tipo.

Las proposiciones que aqu se consideran son las proposiciones de asignacin, condicional y de lazo while. Las secuencias de proposiciones se separan con smbolos de punto y coma. Ahora un programa consta de declaraciones seguidas de proposiciones; se siguen necesitando las reglas anteriores (comprobacin en tipos de expresiones) para comprobar expresiones porque las proposiciones pueden tener expresiones dentro de ellas. S id := E

{S. tipo:= if id.tipo = E. tipo then vaco else error _tipo }

S if E then S1

{S. tipo : = if E. tipo = boolean then S1.tipo else error_tipo }

S while E do S1

{S. tipo := if E.tipo = boolean then S1.tipo else error_tipo }

S S1;S2

{ S.tipo := if S1.tipo= vaco and S2.tipo = vaco then vaco else error_tipo }

(e) Comprobacin de tipos de funciones La aplicacin de una funcin a un argumento puede ser representada por la produccin EE ( E ) en la que una expresin es la aplicacin de una expresin a otra. Se pueden aumentar las reglas para asociar expresiones de tipos con el no terminal T con la siguiente produccin y accin para permitir tipos de funcin en las declaraciones. T T1 '' T2 { T.tipo:= T1.tipo T2.tipo}

Las comillas alrededor de la flecha que se usa como constructor de funcin lo distinguen de la flecha que se usa como metasmbolo en una produccin.

La regla para comprobar el tipo de aplicacin de una funcin es E E1 (E2 )

{E. tipo:= if E2.tipo = s and E1.tipo = s t then t else error_tipo }

Esta regla indica que en una expresin formada por la aplicacin de E1 a E2, el tipo de E1 debe ser una funcin s t del tipo s de E2 a algn tipo de rango t; el tipo de E1(E2) es t. Se pueden estudiar muchos aspectos relacionados con la comprobacin de tipos en presencia de funciones con respecto a la sencilla sintaxis anterior. La generalizacin hacia funciones con ms de un argumento se realiza construyendo un tipo producto que consta de los argumentos. Obsrvese que n argumentos de tipo T1, , Tn se pueden considerar como un solo argumento de tipo T1 xx Tn. Por ejemplo, se puede escribir raz : (real real) x real real

para declarar una funcin raz que toma una funcin de reales a reales y un real como argumentos y devuelve un real. La sintaxis tipo Pascal para esta declaracin es

function raz {function f (real): real; x: real): real (La sintaxis raz : (real real) x real real separa la declaracin del tipo de una funcin de los nombres de sus parmetros.)

Equivalencia de Tipos

Objetivo: Determinar si dos expresiones de tipo se consideran equivalentes. Dos modos de equivalencia de tipos: 1. Equivalencia nominal

Se dice que dos tipos de datos T1 y T2 son nominalmente equivalentes si responden a una misma entrada dentro del registro de tipos realizado por el compilador durante la gestin de declaraciones. A continuacin un ejemplo de lo que se explic previamente:

TYPE T1 = ARRAY [1..10] OF INTEGER; T2 = ARRAY [1..10] OF INTEGER; T3 = T1 T1 T1 T2 T3 Equivalente No equivalente Equivalente T2 No equivalente Equivalente No equivalente T3 Equivalente No Equivalente Equivalente

2. Equivalencia estructural: Se dice que dos tipos de datos son estructuralmente equivalentes si son el mismo tipo bsico o estn formadas mediante la aplicacin del mismo constructor de tipos sobre expresiones de tipos estructuralmente equivalentes.

En seguida se muestra un ejemplo de lo que se explic previamente:

TYPE T1 = ARRAY [1..10] OF INTEGER; T2 = ARRAY [1..10] OF INTEGER; T3 = T1

T1 T1 T2 T3 Equivalente Equivalente Equivalente

T2 Equivalente Equivalente Equivalente

T3 Equivalente Equivalente Equivalente

NOTA: La equivalencia nominal es ms sencilla de implementar. Basta comprobar que coinciden los nombres asociados las expresiones de tipo.

PROBLEMA: Es menos flexible para el programador.

(b) Representacin de expresiones de tipo

Estructuras de datos internas usadas por el compilador para manejar la expresin de tipo. Deseable representaciones manejables que permitan comprobacin de tipos eficiente Dependen del tipo de equivalencia de tipos considerada

Codificacin binaria Dos posibilidades: Estructuras arbreas

1. CODIFICACIN

Usada para expresiones de tipo sencillas. Se asigna un nmero binario a cada expresin de tipo posible. Comparacin de tipos muy eficiente Uso de operaciones a nivel de bits (desplazamientos, AND, OR, uso mscaras, etc)

Ejemplo: array(pointer(char)) 101 100 001

TIPO BSICO

CODIFIC

CONSTRUCTOR

CODIFIC

boolean char integer real

000 001 010 011

pointer array funcion

100 101 110

2. ESTRUCTURAS ARBREAS

Expresiones de tipo representadas en forma de rboles

hojas tipos bsicos nodos internos constructores de tipo

Mtodo ms general que anterior Comparacin tipos supone recorrido sobre el rbol Ejemplo: (real (char char)) pointer(integer)

Otra posibilidad: Uso de DAG (grafos dirigidos acclicos) Forma condensada de representar arboles Estructuras repetidas se representan implcitamente

menos memoria Representacin compacta comparacin ms rpida construccin ms compleja

7.5 Conversin de Tipos

Conversin de tipos: Modificacin del tipo asignado a una construccin del programa.

Dos

Implcita: realizada por el compilador automticamente. tipos Explcita: realizada por programador (cast).

Conversin implcita: Se limita a situaciones donde no se pierde informacin. Conversin de tipo ms especfico a otro ms general. Ej.: cambio de entero a real, de char a int (en C), etc,..

Relacionado con el uso de operadores sobrecargados. Supondr la inclusin de nuevo cdigo adicional para realizar la conversin en el cdigo objeto generado. Ejemplo: Conversin implcita con operadores aritmticos.

Exp num entero Exp num real

{Exp.tipo = integer } {Exp.tipo = real }

Exp id Exp Exp op Exp

{Exp.tipo = TDS obtenerTipo(id.texto)} {Exp0.tipo = if (Exp1.tipo=integer) and (Exp2.tipo=integer) then return (integer) else if (Exp1.tipo=integer) and (Exp2.tipo=real) then convertirReal(Exp1) return(real) else if (Exp1.tipo=real) and (Exp2.tipo=integer) then convertirReal(Exp2) return(real) else if (Exp1.tipo=real) and (Exp2.tipo=real) then return(real) else return(error) }

Siendo op un operador aritmtico: +,, , /.

Conversin explicita

Se dice que la conversin es explicita si el programador debe escribir algo para motivar la conversin. En la prctica todas las conversiones en Ada son explcitas. Para un comprobador de tipos, las conversiones explcitas parecen iguales que las aplicaciones de funcin as que no presentan problemas nuevos.

Por ejemplo, en Pascal, la funcin predefinida ord transforma un carcter en un entero, y char realiza la transformacin inversa de entero a carcter, as que estas conversiones son explicitas. Por otra parte, C coerciona (es decir, convierte implcitamente) los caracteres ASCll a enteros entre o y 127 en las expresiones aritmticas. SOBRECARGA DE FUNCIONES Y OPERADORES

Un smbolo sobrecargado es el que tiene distintos significados dependiendo de su contexto. En matemticas, el operador de suma + est sobrecargado, porque + en A + B tiene distintos significados si A y B son enteros, reales, nmeros complejos o matrices. En Ada, los parntesis ( ) estn sobrecargados; la expresin A ( I) puede ser el I-simo elemento de la matriz A, una llamada a la funcin A con argumento I o una conversin explcita de la expresin I al tipo A.

La sobrecarga se resuelve cuando se determina un significado nico para un caso de un smbolo sobrecargado. Por ejemplo, si + puede denotar una suma real o entera, entonces los dos casos de + en x+ ( i +j) pueden denotar diferentes formas de suma, dependiendo de los tipos de x. i y j. La resolucin de la sobrecarga a menudo aparece referida como identificacin de operadores, porque determina la operacin que denota un smbolo de operador.

Los operadores aritmticos estn sobrecargados en la mayora de los lenguajes.

Sin embargo, la sobrecarga que afecta a los operadores aritmticos como +se puede resolver observando nicamente los argumentos del operador. El anlisis de casos para determinar si se debe utilizar la versin entera o la real de +es similar al de la regla semntica para E E11 op E2, donde el tipo de E se determina observando los tipos posibles de E1 y E2.

FUNCIONES POLI MORFICAS

Un procedimiento normal permite que las proposiciones de su cuerpo se ejecuten con argumentos de tipos fijos; cada vez que se llama un procedimiento polimrfico, las proposiciones de su cuerpo pueden ejecutarse con argumentos de tipos distintos. El trmino "polimrfico" tambin se aplica a cualquier parte de cdigo que pueda ejecutarse con argumentos de tipos distintos de modo que se puede hablar de funciones as como de operadores polimrficos.

Los operadores predefinidos para indicar matrices aplicar funciones y manipular apuntadores son generalmente polimrficos porque no se limitan a una determinada clase de matriz, funcin o apuntador. Por ejemplo, el manual de referencia de C establece acerca del operador apuntador &: "Si el tipo de operando es ' .. .' el tipo de resultado es 'apuntador a .. .'''. Puesto que cualquier tipo se puede sustituir por" ... ", el operador & en C es polimrfico.

Bibliografa:

Francisco Jos Ribadas Pena-PROCESADORES DE LENGUAJES 4o Informtica Compiladores: Principios, tcnicas y herramientas. Alfred V. Aho- Ravi Sethi-Jeffrey D. Ullman Pearson.Addison Wesley.Longman, 1era Edicin, 1990.

Anlisis semntico II: Comprobacin de tipos.- Javier Vlez Reyes.

Ejemplo: //Librerias #include <stdio.h> #include <iostream.h>

//Se declara un tipo especial vacio void main() { //Se declaran los tipos de expresiones, las cuales son float e int, en este caso, la conversion sera de tipo flotante a tipo entero. float num1, num2; int nume1, nume2; cout<<"Ingresa dos numeros: \n"; cin>>num1>>num2; //Es en esta parte del programa donde se hace la conversion. nume1 = num1; nume2= num2; cout<<"Los numeros ingresados son: "<<num1<<", "<<num2<<"\n"; cout<<"Con la conversion: "<<nume1<<", "<<nume2;

Ejercicios: 1. Crea un programa que incluya al menos un tipo bsico y un tipo especial.

#include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <string.h> #include <ctype.h> //En esta parte se declaran los tipos. En este caso, se ha declaro un tipo especial vaco y un tipo bsico de tipo char. void main () { char cadena[100]; int carac, cont,m,mayuscula, j=1, i;

cout<<"Introduce la cadena que incluir maysculas: \n"; gets(cadena); carac=strlen(cadena); cout<<"\nLa cadena tiene "<<carac<<" elementos."; cont=carac; mayuscula=cont; cout<<"\n\nLas maysculas que tienen la cadena son: \n\n"; for(i = 0; cadena[i]; i++) //Adems se agreg una funcin para detector las letras maysculas. if (isupper(cadena[i])) cout<<j++<<". "<<cadena [i]<<"\n"; } 2. Realiza un programa que capture una matriz de T x I. Que sea de tipo entero. //Se declaran las libreras. #include <iostream.h> #include <conio.h> void main() { clrscr(); //Se crea una matriz (que forma parte de un constructor) de tipo entero. int x[10][10], j, i,c,f,p; cout<<"Ingresa las columnas que quieres: \n"; cin>>c; cout<<"Ingresa las filas que quieres: \n"; cin>>f; p=c*f; cout<<"Teclea "<<p<<" numeros: \n"; for (i=0; i<f; i++) { for (j=0; j<c; j++) { cin>>x[i][j]; } } cout<<"Los valores son: \n"; for (i=0; i<f; i++)

{cout<<"\n"; for (j=0;j<c; j++) { cout<<"\t"<<x[i][j]; } } getch(); } 3. Haz un programa con conversin implcita.

#include <stdio.h> #include <iostream.h>

//Se declaran tipos bsicos y especiales. void main() { int n1, n2, n3; float nu1, nu2, nu3; cout<<"Ingresa tres numeros: \n"; cin>>n1>>n2>>n3; //Conversin que se realiza de forma sencilla y sin perdida de informacin. nu1 = n1; nu2 = n2; nu3 = n3; cout<<"Los numeros ingresados son: "<<n1<<", "<<n2<<", "<<n3<<"\n"; cout<<"Con la conversion: "<<nu1<<", "<<nu2<<", "<<nu3;

Cuestionario del tema 1.3 Comprobacin de tipos en expresiones. 1. De qu es capaz un lenguaje con comprobacin fuerte de tipos? Garantizar que los programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo. 2. En qu tiempo se detectan los errores de tipo? Los errores de tipo siempre se detectan en tiempo de compilacin. 3. Qu es lo que debe comprobar el compilador? Debe comprobar si el programa fuente sigue tanto las convenciones sintcticas como las semnticas del lenguaje fuente. 4. Qu es lo que hace un comprobador de tipos ante un error? Un comprobador de tipos debe informar de la naturaleza y posicin del error y recuperarse para continuar con la comprobacin del resto del programa a analizar. 5. Qu garantiza la comprobacin esttica? Garantiza la deteccin y comunicacin de algunas clases de errores de programacin. Los ejemplos de comprobacin esttica incluyen: 6. Cules son los ejemplos de la comprobacin esttica? Comprobaciones de tipos Comprobaciones de flujo de control Comprobaciones de unicidad Comprobaciones relacionadas con nombres 7. Qu es un sistema de tipos? es una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa, que permiten asociar tipos a las construcciones del lenguaje y verificar su correccin. 8. Qu son las expresiones de tipos? Una expresin de tipo es o bien un tipo bsico, o es el resultado de aplicar un constructor de tipo a otra expresin de tipo de acuerdo a unas reglas de construccin (dadas por el lenguaje). 9. Menciona los tipos bsicos: char boolean real integer Tipos especiales: error, void (vaco).

10. Qu indica el tipo especial error? Indica que no se puede asociar una expresin de tipo correcta. 11. Qu indica el tipo especial void (vaco)? Indica que una construccin del lenguaje es correcta, pero no tiene ningn tipo asociado. 12. Qu permiten los constructores de tipo? Permiten formar tipos complejos a partir de otros ms simples.

13. Qu incluyen los constructores? Matrices, productos, registros, punteros, funciones. 14. Qu son los atributos? Son una expresin de tipo asociada a un nombre/fragmento de cdigo. 15. Cul es el objetivo de la equivalencia de tipos? Determinar si dos expresiones de tipo se consideran equivalentes. Existen dos tipos de equivalencias: la equivalencia nominal y la equivalencia estructural. 16. Menciona a que se refiere la equivalencia nominal: Se dice que dos tipos de datos T1 y T2 son nominalmente equivalentes si responden a una misma entrada dentro del

registro de tipos realizado por el compilador durante la gestin de declaraciones. 17. Menciona a que se refiere la equivalencia estructural: Se dice que dos tipos de datos son estructuralmente equivalentes si son el mismo tipo bsico o estn formadas expresiones de tipos

mediante la aplicacin del mismo constructor de tipos sobre estructuralmente equivalentes.

18. A qu se refiere la conversin de tipos? A la modificacin del tipo asignado a una construccin del programa. Existe la conversin implcita y explcita. 19. De qu trata la conversin implcita? Son las que el compilador realiza automticamente, se limita a situaciones donde no se pierde informacin, as como una conversin de tipo ms especfico a otro ms general. 20. De qu trata la conversin explcita? Se dice que la conversin es explicita si el programador debe escribir algo para motivar la conversin.