untitled 1

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.

Upload: nayelys-ramos-lucas

Post on 01-Jul-2015

22 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Untitled 1

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.

Page 2: Untitled 1

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.

Page 3: Untitled 1

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).

Page 4: Untitled 1

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.

Acciones agregadas en un Analizador sintáctico descendente (top-down).

Page 5: Untitled 1

Pila semántica en un analizadorsintá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.

Page 6: Untitled 1

Administración de la tabla desí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.

Page 7: Untitled 1

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”.