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 |