You are on page 1of 10

UNIVERSIDAD NACIONAL DE SAN AGUSTN I Escuela Profesional de Ingeniera de Sistemas

Laboratorio
Compiladores

Lizeth Joseline Fuentes Prez e Luciano Arnaldo Romero Calla


Junio, 2012

Indice
9 Anlisis Semtico y Chequeo de Tipos a a 9.1 Introduccin al anlisis semntico . o a a 9.2 Ambitos . . . . . . . . . . . . . . . 9.3 Tabla de s mbolos . . . . . . . . . . 9.4 Tipos . . . . . . . . . . . . . . . . 9.5 Chequeo de tipos . . . . . . . . . . 9.6 Entornos de tipo . . . . . . . . . . 9.7 Subtipicacin . . . . . . . . . . . . o 9.8 Mtodos de tipicado . . . . . . . . e 9.9 Implementacin de chequeo de tipos o ii ii ii iii iii iv v v v vi vii vii vii viii viii viii ix

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

10 Comprobacin de Tipos Cool o 10.1 Tipado Dinmico versus Esttico a a 10.2 Tipos propios . . . . . . . . . . 10.3 Operaciones de Tipos propios . . 10.4 Uso de Tipos propios . . . . . . 10.5 Comprobacin de Tipos propios o 10.6 Recuperacin de errores . . . . . o

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Anlisis Semtico y Chequeo de Tipos a a


9.1 Introduccin al anlisis semntico o a a

El anlisis lxico detecta los tokens ilegales en la entrada, el anlisis sintctico detecta los errores en la a e a a entrada por los rboles de anlisis sintctico mal formados. a a a El anlisis semntico es la ltima fase front end, captura todos los errores restantes. El anlizador a a u a sintctico no detecta algunos errores, algunos constructores de lenguajes dependientes de contexto. a Chequeo de muchos tipos: 1. Todos los identipicadores son declarados. 2. Tipos. 3. Relaciones de herencia. 4. Denicion de clases una vez. 5. Mtodos en una clase denidos una vez. e 6. Identipicadores reservados no estn mal. a Entre otros. Los requerimientos dependen del lenguaje.

9.2

Ambitos

Emparejar las declaraciones de identipicadores con sus usos. Un paso importante es el anlisis esttico a a en la mayoria de lenguajes. El alcance de un identipicador es la porcin del programa en el cual el identipicador es accesible. o El mismo identipicador puede referirse a diferentes cosas en diferentes partes del programa; diferentes mbitos para el mismo nombre no se sobreponen. Un identipicador puede tener alcance restringido. a Ms lenguajes tienen alcance esttico. El alcance depende solo del programa en texto, no del coma a portamiento en tiempo de ejecucin. Cool tiene alcance esttico. o a

ii

Unos pocos lenguajes tienen alcance dinamico. Como Lips, Snobol; Lips ha cambiado en su mayora a alcance esttico, el alcence depende sobre la ejecucin del programa. a o Una variable de dinmica de alcance se reere al enlazamiento cerrado en la ejecucin del programa. a o

9.3

Tabla de s mbolos

En general el anlisis semntico puede ser expresado como un descendente recursivo del AST. a a Antes: procesar un nodo n del AST. Recursividad: procesar los hijos de n. Despus: Terminar procesando el nodo n del AST. e Al realizar el anlisis semntico en una porcin del AST, nosotros necesitamos conocer cuales idena a o tipicadores son denidos. Una tabla de s mbolos es una estructura de datos que rastrea los actuales enlaces de los identipicadores. Para una simple tabla de s mbolos nosotros podemos usar una pila. Los nombres de clases pueden ser usados antes de ser denidos. No podemos comprobar los nombres de las clases usando una tabla de s mbolos o incluso con una pasada. La solucin es recolectar o todos los nombres de clases o vericando. El anlisis semntico requiere probablemente mas de una pasada. a a

9.4

Tipos

La denicin de tipo varia de lenguaje a lenguaje. En consenso podemos decir que es un conjunto de o valores y las operaciones sobre ellos. Las clases son una instanciacin de una moderna nocin de tipo. o o Ciertas operaciones son legales para los valores de cada tipo. Un sistema de lenguajes de tipo especica que operaciones son vlidas para que tipos. El objetivo a del chequeo de tipos es asegurar que las operaciones son usadas slo con los tipos correctos. o Tres tipos de lenguajes: 1. Tipado esttico: todos o casi todos los chequeos de tipos son hechos en la parte de compilacin a o (C, Java, Cool). 2. Tipado dinmico: casi todos los chequeos de tipos son echos en la parte de ejecucin (Scheme, a o Lips, Python, Perl). 3. No tipado: no tienen chequeo de tipos (cdigo mquina). o a El chequeo de tipos es el proceso de vericacin por completo de programas tipados. La inferencia o de tipos es el proceso de rellenar en informacin perdida de tipos. Los dos son diferentes pero a menudo o son usados indistintamente.

iii

9.5

Chequeo de tipos

Hemos visto dos formas formales de especicar las partes de un compilador: expresiones regulares y gramticas libres de contexto. La formalidad apropiada para el chequeo de tipos son las reglas lgicas a o de inferencia. Una regla de inferencia tiena la forma: If Hiptesis is true, then Conclusin is true o o El chequeo de tipos calcula mediante razonamientos: If E1 and E2 have certain types, then E3 has a certain type Las reglas de inferencia son una notacin compacta de la sentencia If-then. o La notacin es fcil de leer con prctica. Construyendo bloques: o a a El s mbolo es and El s mbolo es if-then x : T es X tiene el tipo T La sentencia: (e1 :Int e2 :Int) e1 + e2 :Int es un caso especial de: Hiptesis1 ... Hiptesisn Conclusin o o o Esto es una regla de inferencia. Por tradicin las reglas de inferencia se escriben: (H = Hiptesis, C = Conclusin) o o o H ... H C Donde signica es probable que... i i s an i nteger li ter al [Int] i : Int e1 : Int e2 : Int [Add] e1 + e2 : Int Por ejemplo: 1 i s an i nteger li ter al 2 i s an i nteger li ter al 1 : Int 2 : Int 1 + 2 : Int

iv

9.6

Entornos de tipo
f alse : Bool [F alse]

s i s an str i ng [Str i ng] s : Str i ng new T produce un objeto de tipo T , ignoramos SELF TYPE for ahora: [New ] new T : T Dado O es una funcin que va de los ObjectIdentiers a Types. La sentencia O e : T es leida: o bajo la asuncin que las variables libres tienen los tipos dados por O, es demostrado que la expresin e o o tiene el tipo T . Los entornos de tipo dan tipos a los identipicadores libres en el mbito actual. El entorno de tipo a es descendente de la ra hacia las hojas. Los tipos son calculados por el AST desde las hojas hacia la z ra z.

9.7

Subtipicacin o

Denamos la relacin sobre clases: o XX X Y if X hereda de Y X Z if X Y and Y Z

9.8

Mtodos de tipicado e

Las reglas de tipo son denidas en la estructura de las expresiones. Los tipos de variables son modelados por un entorno. Las reglas de los tipos son muy compactas.

9.9

Implementacin de chequeo de tipos o

En Cool el chequeo de tipos se puede implementar con un simple recorrido. El entorno de tipo es pasado de los padres a los hijos, los tipos se pasas en el rbol de los hijos a los padres. a

vi

10

Comprobacin de Tipos Cool o


10.1 Tipado Dinmico versus Esttico a a

En tiempo de compilacin se detectan los errores comunes, y los erros de tipos estticos pero algunos o a programas que son correctos en tiempo de compilacin, pueden no ser permitidos en tiempo de ejeo cucin, porque su sistema de tipos es ms complejo, como es en la programacin orientada a objetos o a o existe la comprobacin dinmica de tipos que se da en tiempo de ejecucin. o a o El tipado dinmico de un objeto es la clase por ejemplo la expresin new C se crea el objeto con a o sus atributos en tiempo de ejecucin, se usa en todos los lenguajes que no estan estticamente tipados. o a El tipado esttico de una expresin se da en tiempo de compilacin. a o o Teorema de rmeza: Para todas las expresiones de E ti pod i nami co(E) = ti poe stati co(E) quiere decir que en todas las ejecuciones E evalua los valores que son inferidos por el compilador. En los lenguajes de programacin orientado a objetos se puede apreciar sta distincin de tipos en la o e o her enci a, donde todas las operaciones que pueden ser usadas en un objeto de tipo C pueden tambien ser usadas en un objeto C y C C, y las subclases solo pueden aadir atributos o metodos que pueden n ser redenidos pero mantener el mismo tipo.

10.2

Tipos propios

Un tipo propio no es un tipo dinmico, es un tipo esttico que ayuda al comprobador de tipos a mantener a a mejor el rastreo de tipos. Lo cual le permite al comprobador de tipos aceptar ms programas correctos e incrementa la exprea sividad del poder del sistema de tipos.

vii

10.3

Operaciones de Tipos propios

Si se tiene el ejemplo:

class Count Int i-0; inc(): SELFTYPE i-i+1 ; selfi El tipo del objeto retornado por i nc() puede ser un tipo propio. Adems el mtodo i nc() puede ser invocado por cualquiera las clases qye hereden de la clase Count a e En general si el tipo propio aparece textualmente en la clase C declarado de tipo E entonces ti pod i nami co(E) C y sto sugiere que se cumpla la regla e selft y peC C lo cual garantiza que se reemplaze selft y peC por C. Reglas: 1. En Cool nunca se comparan selft y peC que vienen de diferentes clases. 2. La regla reexiva selft y peC T si C T 3. Si T selft y peC es siempre falso porque T nunca es un subtipo de selft y peC . 4. T T relaciones de subtipos que no son totalmente tipos propios.

10.4

Uso de Tipos propios

El comprobador de tipos propios solo aparece cuando un tipo es esperado pero no se permite donde sea que un tipo puede aparecer. Ejemplo: 1.- class T inherits T ... T, T no puede ser SELFTYPE 2. x : T Attribute x T can be SELFTYPE

10.5

Comprobacin de Tipos propios o

El signicado depende de la clase que lo encierra.Se puede denir como: O, M, C| e : T

viii

Una expresin e ocurre en cuerpo de C que tiene un tipo esttico T dado un mbito de tipos de o a a variables O y signaturas de mtodos M. e En la prctica deber haber un balance entre complejidad del sistema de tipos y su expresividad. a a

10.6

Recuperacin de errores o

Detectar donde ocurren los errores es ms fcil que en el parser ya que no se necesita saltar entre las a a porciones de cdigo. o Se analiza si un tipo es asignado a una expresin con un tipo que no le corresponde. o En un compiladr real se introduce un nuevo tipo el Not y pe en las expresiones que no estn bien a tipadas.

ix

You might also like