TAREA_1_FERNANDEZ
FASE DE ANALISIS SEMANTICO
Esta fase revisa al árbol sintáctico junto con los atributos y
la tabla de símbolos para tratar de encontrar errores semánticos. Para todo
esto se analizan los operadores y operandos de expresiones y proposiciones.
Finalmente reúne la información necesaria sobre los tipos de datos para la fase
posterior de generación de código. En resumen la semántica corresponde al
significado asociado a las estructuras formales (sintaxis) del lenguaje.
El componente más importante del análisis semántico es la
verificación de tipos. Aquí, el compilador verifica si los operandos de cada
operador son compatibles según la especificación del lenguaje fuente.
FUNCIONES PRINCIPALES:
1) Identificar
cada tipo de instrucciones y sus componentes.
2) Completar
la tabla de símbolos.
3) Realizar
distintas comprobaciones y validaciones:
§ Comprobaciones
de tipos
§ Comprobaciones
del flujo de control
§ Comprobaciones
de unicidad
§ Comprobaciones
de emparejamiento
El analizador semántico finaliza la fase de análisis del
compilador y comienza la fase de síntesis, en la cual se comienza a generar el
código objeto.
ACCIONES SEMANTICAS
Dependiendo del tipo de sentencias, las acciones semánticas
pueden agruparse en:
1. SENTENCIAS
DE DECLARACION: completar la sección de los tipos de la tabla de símbolos.
2. SENTENCIAS
“EJECUTABLES”: realizar comprobaciones de tipos entre los operandos implicados.
3. FUNCIONES
Y PROCEDIMIENTOS: comprobar el número, orden y tipo de los parámetros actuales
en cada llamada a una función o procedimiento.
4. IDENTIFICACION
DE VARIABLES: comprobar si un identificador ha sido declarado antes de
utilizarlo.
5. ETIQUETAS:
comprobar si hay etiquetas repetidas y validación.
6. CONSTANTES:
comprobar que no se utilicen en la parte izquierda de una asignación.
7. CONVERSIONES
Y EQUIVALENCIAS DE TIPO: verificación.
8. SOBRECARGA
DE OPERADORES Y FUNCIONES: detectar y solventar.
TABLA DE SIMBOLOS
La tabla de símbolos permite que al analizador léxico devuelva
un token distinto según la categoría del identificador en este contexto. Esta
tabla va conteniendo un registro por cada identificador definido/declarado por
el programador, añadiéndose información asociada:
§ Registra
del identificador (¿mayúsculas y minúsculas¿).
§ Categoría:
variable, constante, tipo, campo, procedimiento, función, parámetro, clase,
etiqueta, modulo, macro, etc.
§ A
que ámbito pertenece (profundidad).
ESTRUCTURA DE LA TABLA
DE SIMBOLOS
A. LOGICA:
viene determinada por:
·
El tipo de ámbito (estático o dinámico)
·
Los mecanismos de ámbito del lenguaje:
Procedimientos, bloques, herencia, módulos, espacios de nombres,
registros, witch,….
·
Si se da más de una pasada.
·
Compilación separada: ficheros con tablas.
B. IMPLEMENTACION
FISICA: más eficiente suele ser la de una tabla de hash, asociada a pila de
ámbitos activos.
Truco: mover
(insertar, al menos) el elemento actual a la cabeza de la lista.
C. LAS
RISTRAS: (identificadores, constantes) pueden ir en lista(s) aparte.
CHEQUEOS DE TIPOS (Y
OTROS).
Un compilador debe realizar una serie de chequeos estáticos,
como chequeos de tipos:
ü Consistencia:
unicidad, existencia, no –ciclicidad,….
ü Equivalencia
y compatibilidad de tipos.
ü Conversión
explicita [cast] o forzada [coercion].
ü Inferencia
de tipos (en valores).
ü Sobrecarga
de funciones y operadores.
ü Funciones
polimórficas.
DEFINICIONES DE TIPOS
También llamadas “expresiones de tipos”, en las que el
programador desarrolla los componentes de la estructura. CUESTIONES:
1) Puede
ser conveniente construir un árbol/grafo:
§ En
caso de equivalencias estructural
§ Para
comprobación de no-ciclicidad:
Type a=b; b=a;
2) (Descomponer
en) tipos anónimos.
Las definiciones incompletas (declaraciones) son necesarias para
definiciones recursivas: entrada en tabla provisionalmente “vacía” para tipo
base.
No hay comentarios:
Publicar un comentario