Clase digital 12. Análisis semántico y estrategias de implementación

Portada » Clase digital 12. Análisis semántico y estrategias de implementación

Análisis semántico y estrategias de implementación

Introducción

¡Hola!

Es todo un privilegio contar con tu asistencia en esta nueva sesión, es muy seguro que la vas a disfrutar y aprenderás mucho, es por ello que te invito a iniciar la clase doce del curso.

 En esta sesión aprenderemos sobre 

Sin más detalles, estamos listos para iniciar el estudio de este emocionante tema.

¡Adelante! ¡Comencemos!

Desarrollo del tema

Análisis Semántico:

El análisis semántico es la fase que se encarga de validar el código fuente

Además de que el código debe ser sintácticamente correcto, debe ser coherente con su contexto

  • Por ejemplo:
    • La suma sólo se puede efectuar entre datos que son numéricos.
    • Una variable debe ser declarada antes de usarse.

La tarea principal del análisis semántico es la inferencia y la verificación de tipos.

Tabla de símbolos:

La tabla de símbolos es una estructura de datos creada y mantenida por un compilador para almacenar información sobre: 

  • variables, 
  • constantes, 
  • funciones, 
  • objetos, 
  • clases, 
  • interfaces, etc.
Usos de la tabla de símbolos:
  • Almacenar todos los nombres de entidades de forma estructurada en un solo lugar.
  • Verificar si una variable o función ya ha sido declarada.
  • Implementar el chequeo de tipos.

Determinar el ámbito de un nombre (resolución de ámbito).

Ámbitos y Tabla de Símbolos:

scope = ámbito

Cada ámbito puede tener sus propias variables locales.
La tabla de símbolos se puede implementar con un arreglo, una lista o tabla de hash.

Los ámbitos se pueden gestionar usando un stack o un árbol de tablas de símbolos.

Inferencia de Tipos:

Los tipos básicos son:

  • boolean, char, integer, float y void.

Una expresión de tipo es:

  • Un nombre de tipo.
  • Constructor array con un número y una expresión de tipo.
  • Constructor record con los nombres de los campos y sus tipos.
  • Constructor de función →
    • Si s y t son expresiones de tipo, entonces su producto Cartesiano s×t es una expresión de tipo.
  • Una variable cuyo valor es una expresión de tipo.

Ejemplos:
int[2][3]
array(2,array(3,integer))
record(x, float, y, int)

Determinar tipos, nombres y tamaños de variables.

T representa un tipo escalar o arreglo.
B representa un tipo escalar.
C representa un tipo arreglo o no.

El tipo se determina por propagación (o herencia) de atributos.
Es decir, B recibe atributos type y width, t almacena tipo y w almacena el tamaño de B,
luego C toma atributos t y w, y T recibe atributos de C.

Propagación de atributos:

Registros, Estructuras y Clases.

Los registros, estructuras y clases tienen su propio ámbito de variables.
Se crea un nuevo ámbito con su tabla de símbolos local.

Las tablas de símbolos pueden implementarse usando listas, árboles de búsqueda binaria o tablas de hash.

Los ámbitos de variables pueden implementarse usando un stack de tablas de símbolos.

Un atributo sintetizado es aquél cuyo valor depende de los atributos de los nodos hijo.

Los atributos que no son sintetizados son llamados heredados.

El analizador LR es adecuado para calcular los atributos sintetizados durante el análisis sintáctico.

En Yacc y Bison, la notación para asignar un atributo a un nodo es $$ = valor

La notación para leer el valor del atributo del k-ésimo símbolo de una producción es $k.

Conclusión

Para recordar:

Con esto terminamos la clase y como puedes notar has aprendido mucho durante el trayecto del curso ¡Muchas felicidades! Te invito a repasar los temas y conceptos revisados y la realización de las consignas para que se pueda alcanzar el aprendizaje esperado en esta clase. Recuerda buscar a tu asesor en caso de dudas. Te encuentro en tu próxima sesión.

Fuentes de información