You are on page 1of 7

Analizador semántico

Un compilador no solo tiene que revisar la sintaxis de código


fuente, si no también la semántica de este.
Al igual que en los lenguajes naturales (español, ingles, etc.) en
los lenguajes de programación existen reglas semánticas para
definir el significado de los programas, estatutos, expresiones,
etc.
Por ejemplo un error semántico es usar (en pascal ó java) un
identificador que no fue anteriormente declarado.
Otro ejemplo de error semántico en un programa es cuando
este es compilado y y no se detectan errores pero el momento de
ser ejecutado este programa no funciona correctamente.
Verificación de tipos en expresiones.
Cuando mezclamos diferentes tipos en una misma expresión o que llamamos una
rutina que no existe, existe un error semántico.
Una de las funciones del analizador semántico es verificar que los tipos de una
expresión sean compatibles entre si.
Para hacer lo anterior el compilador cuenta con información de los atributos (tipos,
tamaño, número de argumento, etc.) de los identificadores en una tabla de símbolos.
Conversión de tipos.

Algunas veces los tipos de una expresión o estatuto son diferente.


Por ejemplo en la asignación,
a = b * c;
el tipo del resultado de evaluar b*c es diferente al de el identificador a.
El compilador algunas veces con ciertos diferentes tipos puede hacer
una conversión interna en forma implícita para solucionar el problema.
Otras veces el programador explícitamente es el que hace la conversión
(casting).
Acciones agregadas en un Analizador
sintáctico descendente (top-down).
En un parser recursivo-descendente, el código de las acciones semánticas es
mezclado dentro del flujo de control de las acciones del parser. En un parser
especificado en javaCC, las acciones semánticas son fragmentos de código de
programa en java unido a las producciones gramáticales.
Cada símbolo terminal y noterminal puede asociarse con su propio tipo de valor
semántico.
Pila semántica en un analizador sintáctico
ascendente (bottom-up).
Un parserutiliza durante el análisis una pila. En esta va guardando datos
que le permiten ir haciendo las operaciones de reducción que necesita.
Para incorporar acciones semánticas como lo es construir el árbol
sintáctico, es necesario incorporar a la pila del parser otra columna que
guarde los atributos de los símbolos que se van analizando.
Administración de la tabla de símbolos
El análisis semántico conecta las definiciones de las
variables con sus usos, checa que cada expresión tenga un
tipo correcto y traduce la sintaxis abstracta a una
representación mas simple para generar código máquina.
Esta fase es caracterizada por el mantener la tabla de
símbolos (también llamada “environment”) la cual mapea
identificadores con sus tipos y localidades.
Cada variable local en un programa tiene un ámbito
(scope) dentro del cual es visible. Por ejemplo, en un
método MiniJava m, todos los parámetros formales y
variables locales declarados en m son visibles solo hasta
que finalice m.
Manejo de errores semánticos.
Cuando el checador de tipos detecta un error de tipos o un
identificador no declarado, debe imprimir el mensaje de
error y continuar.
Esto debido a que normalmente el programador prefiere
que le describan todos los errores posibles del programa
fuente.
Esto quiere decir, que si un error de tipos es encontrado,
no debe producirse un programa objeto por parte del
compilador.
Así, las siguientes fases no deben ejecutarse.
Hasta esta etapa (chequeo de tipos), la parte del
compilador se conoce con el nombre de “front End”.