Análisis Semántico
Este, al igual que las etapas anteriores, utiliza los resultados de la fase previa, donde se ha generado un árbol sintáctico que muestra cómo se pueden separar los tokens utilizando una gramática específica.
En esta etapa, se verifica la consistencia semántica del programa fuente con la definición del lenguaje. Es decir, se asegura de que las construcciones del programa no solo sean correctas desde el punto de vista gramatical (análisis sintáctico), sino que también tengan sentido lógico y semántico.
Por ello, se hace uso de la tabla de símbolos, donde se completa la información sobre los tipos de datos, identificadores y otras propiedades relevantes.
En otras palabras, el análisis semántico evalúa si las operaciones realizadas en el programa son válidas dentro de su contexto y conformes a las reglas del lenguaje.
En la Figura8 se muestra el proceso de compilación enfocado en las etapas de análisis léxico, sintáctico y semántico, junto con el uso de una tabla de símbolos y el paso hacia la generación de código intermedio.

La imagen muestra el flujo de trabajo básico de un compilador en la etapa de análisis semántico. Se compone de:
- Entrada: Cadena de componentes léxicos (tokens generados por el análisis léxico).
- Análisis sintáctico: Genera un árbol sintáctico a partir de la gramática del lenguaje.
- Análisis semántico: Verifica que las estructuras tengan sentido según las reglas del lenguaje, usando una tabla de símbolos (almacena información como variables y tipos).
- Generador de código intermedio: Traduce el árbol sintáctico validado en código intermedio para las etapas posteriores.
Proceso de validación.
En la siguiente Tabla4 describe las variables utilizadas en el código, su tipo, el propósito de cada una y cómo se inicializan o asignan valores. Esto se basa en el ejemplo de la Figura 3, que representa una calculadora básica.

Este ordenamiento nos ayuda a entender cómo las variables están relacionadas con las operaciones en el código.
Tabla5 resume las verificaciones realizadas para asegurar que las entradas del usuario son válidas y seguras de usar en las operaciones.

Asegura que el programa no falle debido a entradas no válidas, como un operador no permitido o una división por cero.
Esta Tabla6 describe las operaciones matemáticas realizadas según el operador ingresado por el usuario y cómo están implementadas en el código.

Ayuda a entender cómo el programa ejecuta las operaciones y asegura que cada una corresponde al operador ingresado.
Esta Tabla7 detalla cómo el programa maneja situaciones que podrían generar errores, como operadores inválidos o intentos de dividir por cero.

El manejo de errores garantiza que el programa no se detenga inesperadamente y proporcione retroalimentación clara al usuario.
Estas tablas son útiles para documentar y entender cómo funciona el código, cubriendo desde la declaración de variables hasta la validación y manejo de errores.
Por si aún tienes dudas, te dejo el siguiente video.
Autor desconocido. (n.d.). Análisis semántico del compilador [Video]. YouTube. Recuperado de https://youtu.be/z7tAUJ2PHXM.
Referencias:
Aho, A. V. (2007). Compilers: Principles, Techniques, & Tools. Pearson.
1.3.4. Análisis semántico. (s. f.). https://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/134_anlisis_semntico.html
Rivera, G. L. (2022, 16 noviembre). Análisis semántico - Gian Luca Rivera - Medium. Medium. https://medium.com/@LucaBia/an%C3%A1lisis-sem%C3%A1ntico-i-iii-762cc0d63fb0