Resumen Introducción Tablas de Símbolos Chequeo Semántico Chequeo de Tipos Semántica de un Programa Orientado a Objetos Tipos Polimórficos
¿Dónde estamos? Analizador Léxico (Scanner) Analizador Sintáctico (Parser) (Gp:) Token Stream
Arbol de Parseo (Gp:) Programa (character stream)
¿Dónde estamos? Analizador Léxico (Scanner) Analizador Sintáctico (Parser) (Gp:) Token Stream
Arbol de Parseo (Gp:) Programa (character stream)
Analizador Semántico Generador de Código Intermedio Representación Intermedia + Tabla de Símbolos
¿Qué es la semántica de un programa? Sintáxis Cómo se ve un programa Representación textual o estructura Es posible dar una definición matemática precisa
Semántica Cuál es el significado del programa Es más difícil dar una definición matemática precisa
Por qué hacer análisis semántico Asegurarnos que el programa cumple con la definición del lenguaje de programación Proveer mensajes de error útiles al usuario
Tabla de Símbolos Un lugar para guardar toda la información adicional acerca del programa Representaciones intermedias: expresiones, statements, control de flujo, etc. Tabla de Símbolos: Tipos, variables, scope, etc.
Scope Un nombre puede tener significados distintos en lugares distintos Tipos, variables, etc tiene scope (ámbito) Tenemos que mantener una tabla de símbolos para cada scope
Operaciones en la tabla de símbolos 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
Siguiente Clase Todo acerca de tablas de símbolos Scopes y visibilidad Información que se mantiene en la tabla de símbolos Implementación de tablas de símbolos
Chequeo Semántico Chequeos estáticos vs. Chequeos dinámicos Chequeos estáticos Chequeos de control de flujo Chequeos de unicidad Chequeos de Tipo
Chequeos de Control de Flujo El control de flujo del programa es sensitivo al contexto Ejemplos: Declaración de una variable debe ser visible al usarla (en scope) Declaración de una variable debe estar ántes de usarla Cada camino de salida (exit path) retorna un valor del tipo correcto ¿Qué más?
Chequeos de Unicidad Uso (y mal uso) de identificadores No se puede representar en una CFG (mismo token) Ejemplos: Ningún identificador puede ser usado para dos definiciones diferentes en el mismo scope
Chequeos de Tipo Los chequeos semánticos más extensos Ejemplos: Que el número de argumentos haga match con el número de parámetros formales y que los tipos correspondientes sean equivalentes Si se llama como expresión, debe retornar un tipo Cada acceso a una variable debe hacer match con la declaración (arreglo, estructura, etc.) Los identificadores en una expresión deben ser “evaluables” LHS de una asignación debe ser “asignable” En una expresión los tipos de las variables, tipos de retorno de métodos y de operadores deben ser “compatibles”
Chequeos Dinámicos Chequeos de límites de arreglos Chequeo de dereferencia del Null Pointer
Sistemas de Tipos Un sistema de tipos es usado para el chequeo de tipos Un sistema de tipos incorpora Construcciones estáticas del lenguaje Noción de tipos Reglas para asignar tipos a construcciones del lenguaje
Expresiones de Tipos Un tipo compuesto es denotado por una expresión de tipo Una expresión de tipo es Un tipo básico La aplicación de un constructor de tipo a otras expresiones de tipo
Página siguiente |