Sei sulla pagina 1di 28

ANÁLISIS SEMÁNTICO

ANÁLISIS SEMÁNTICO EN PROCESADORES DE LENGUAJE

Es aquélla que computa la información


adicional necesaria para el procesamiento de
un lenguaje, una vez que la estructura
sintáctica de un programa haya sido
obtenida.

Es por tanto la fase posterior a la de análisis


sintáctico y la última dentro del proceso de
síntesis de un lenguaje de programación
− Que todos los identificadores que aparecen
en la expresión hayan sido declarados en el
ámbito actual, o en alguno de sus ámbitos
(bloques) previos.

− Que la subexpresión de la izquierda sea


semánticamente válida, es decir, que sea un
lvalue.

− Que a los tipos de los identificadores base y


altura se les pueda aplicar el operador de
multiplicación. Un registro en C, por ejemplo,
Dado el siguiente ejemplo de código en C:
no sería válido.

superficie = base * altura / 2; − Deberá inferirse el tipo resultante de la


división y comprobarse si éste es compatible
con el tipo de superficie para llevar a cabo la
asignación.
1.1 Árboles de expresiones.

● Código de nivel
del lenguaje en
forma de datos.
● Estructura con
forma de árbol.
● Representa y
evalúa una
expresión.
1.1 Árboles de expresiones.
2 características importantes:

● Cualquier hoja está etiquetada ● Cualquier nodo interior n está


sólo con un operando. etiquetado por un operador.

5 +
1.1 Árboles de expresiones.
Características a tomar en cuenta al momento de introducir la expresión:

● Raíz y nodos intermedios → Operador.


● Hojas → Operando.
● Si un operador tiene mayor prioridad que
la raíz se coloca como hijo.
● Si un operador tiene igual o menor
prioridad que un nodo se coloca como
padre.
● Nodo → Subárbol (Hijo).
1.1 Árboles
de
expresiones.
1.2 Acciones semánticas de un analizador sintáctico

Definición de un analizador
sintáctico: es la fase del
analizador que se encarga de
chequear el texto de entrada
en base a una gramática dada.
1.2 Acciones semánticas de un analizador sintáctico

● Acceder a la tabla de símbolos (para


hacer parte del trabajo del analizador
semántico).
● Chequeo de tipos (del analizador
semántico).
● Generar código intermedio.
● Generar errores cuando se producen.
● Realiza casi todas las operaciones de la
compilación.
1.2 Acciones semánticas de un analizador sintáctico

La gramática que acepta el analizador


sintáctico es una gramática de contexto
libre:

Gramática: G (N, T, P, S)

● N = No terminales.
● T = Terminales.
● P = Reglas de Producción.
● S = Axioma Inicial
1.3 Comprobaciones de tipos en expresiones
Comprobaciones estáticas

Comprobaciones dinámicas
1.3 Comprobaciones de tipos en expresiones
Verificación de tipos

Inferencia de tipos
1.4 Pila semántica en un analizador sintáctico.
Las pilas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programación.

Dos operaciones básicas:

● Push (para introducir un elemento).


● Pop (para extraer un elemento).
1.4 Pila semántica en un analizador sintáctico.
Características:

● LIFO.
● Recursividad.
● Información Semántica.
● Un solo lenguaje.
● Hace posible al analizador
sintáctico acceder a la tabla de
símbolos.
1.4 Pila semántica en un analizador sintáctico.
Bottom up.

● Principio de muchos años para


realizar una pila semántica.
● Elementos funcionales pequeños.
● Puede llegar a encubrir errores
como una ciudad encubre a
fugitivos.
1.4 Pila semántica en un analizador sintáctico.
Top down.

● Método que divide problemas en


subproblemas.
● Diseño descendente = método para
resolver problema → lenguaje para
computadora.
1.4 Pila semántica en un analizador sintáctico.
Reglas semánticas.

● Conjunto de normas y
especificaciones dadas por la
sintaxis.
● Asignan significado lógico a
expresiones → sintaxis del lenguaje.
● Puede tener efectos colaterales.
1.4 Pila semántica en un analizador sintáctico.
Ventajas.

● Detecta la validez semántica de las sentencias


aceptadas.
● Las rutinas semánticas realizan la evaluación
de los atributos de las gramáticas.
● Permite agilizar la fase del análisis sintáctico.
● Las rutinas semánticas suelen hacer uso de
una pila → asociada a operadores.
● Guardan el estado de las variables o tokens.
● Su implementación suele ser relativamente
fácil.
1.4 Pila semántica en un analizador sintáctico.
Desventajas.

● Problemas de integración son


sumamente costosos.
● Necesidad de una memoria
auxiliar que guarde los datos para
comparar.
● Tratar de eliminar un elemento
de una pila semántica vacía.
● El tamaño de la pila.
● Avalancha de errores.
1.5 Esquema de traducción
1.6 Generación de la tabla de símbolo y tabla de direcciones.
● Tablas de identificadores y tablas de nombres.
● Estructura de datos relacionada a las fases de
compilación.
● Registra información que se comparte entre varias
etapas.
● Permite administrar los recursos asociados a las
entidades.

Funciones principales:

● Efectuar chequeos semánticos.


● Generación de código.
1.6 Generación de la tabla de símbolo y tabla de direcciones.
Se realizan insertando o recuperando:

● Nombre.
● Tipo.
● Dirección de almacenamiento.
● Dimensión de una variable.
1.6 Generación de la tabla de símbolo y tabla de direcciones.
Estructura.
Valor de atributo | Valor de atributo | Valor de atributo | Valor de atributo → Variable

Valor de atributo | Valor de atributo | Valor de atributo | Valor de atributo → Variable

Valor de atributo | Valor de atributo | Valor de atributo | Valor de atributo → Variable

Valor de atributo | Valor de atributo | Valor de atributo | Valor de atributo → Variable

Valor de atributo | Valor de atributo | Valor de atributo | Valor de atributo → Variable

Las clases de los atributos dependen del lenguaje.


1.6 Generación de la tabla de símbolo y tabla de direcciones.

La tabla de símbolos
consume gran parte
del tiempo de
compilación.
1.6 Generación de la tabla de símbolo y tabla de direcciones.
Ejemplo.

El analizador realiza esta identificación de lexemas de la siguiente instrucción:

velocidad = distancia / tiempo

1. velocidad → ⟨id│1⟩
2. = → 〈=〉
3. distancia → ⟨id│2⟩
4. / → 〈/〉
5. tiempo → ⟨id│3⟩
1.6 Generación de la tabla de símbolo y tabla de direcciones.
El código generado por el analizador léxico se representa como:
⟨id│1⟩〈=〉⟨id│2⟩〈/〉⟨id│3⟩
1.7 Manejo de errores semánticos
Hay, pues, dos criterios a seguir a la
hora de manejar errores:

Pararse al detectar el primer Detectar todos los errores de una


error. pasada.

Potrebbero piacerti anche