Tercera fase de un compilador

El analizador semántico utiliza el árbol sintáctico y la información en la tabla de símbolos para comprobar la consistencia semántica del programa fuente con la definición del lenguaje. También recopila información sobre el tipo y la guarda, ya sea en el árbol sintáctico o en la tabla de símbolos, para usarla más tarde durante la generación de código intermedio. (Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools (2nd ed.). Addison-Wesley).

El análisis semántico verifica que el programa cumpla con las reglas lógicas y estructurales del lenguaje, basándose en el árbol de sintaxis abstracta (AST), que es una versión simplificada del árbol sintáctico. Este análisis se centra en validar que las variables estén declaradas antes de usarse, que las operaciones sean compatibles con los tipos de datos y que las funciones se llamen con el número y tipo de parámetros correctos. Para lograr esto, utiliza una tabla de símbolos, una estructura que registra información clave sobre identificadores, como su tipo, ámbito y ubicación. Por ejemplo, si intentas asignar un texto a una variable numérica, el análisis semántico detecta este error. Además, se encarga de manejar la compatibilidad y coerción de tipos, asegurando que las conversiones automáticas entre tipos sean válidas. Este proceso es esencial para garantizar que el programa sea semánticamente correcto y esté listo para la generación de código intermedio. Sin este paso, el programa podría tener errores que, aunque no afectan su estructura sintáctica, lo harían fallar al ejecutarse. 

Un ejemplo sería:

En la Figura 8, el análisis semántico, uno de los principales objetivos es verificar la coherencia de los tipos de datos en un programa. En este ejemplo, se declara una variable de tipo entero llamada edad, pero luego se le intenta asignar un valor de tipo cadena ("veinte"). Esto genera un error semántico porque el tipo de dato no coincide con el tipo especificado en la declaración. El analizador semántico detectará esta inconsistencia y marcará el error. 


Figura 8. Ejemplo de error semántico causado por la asignación de un tipo incompatible a una variable declarada en un lenguaje en español inspirado en C. Elaboración propia en Canva.

En este caso, en la Figura 8, el análisis semántico revisa varios aspectos clave. Primero, se asegura de que la variable edad esté declarada correctamente como tipo entero y que no se le asigne un valor incompatible. Segundo, verifica que las operaciones entre variables sean válidas según los tipos de datos. En este caso, el intento de asignar una cadena a una variable entera es detectado como un error. Además, si el programa tuviera funciones, también se comprobaría que los tipos y número de parámetros fueran correctos en las llamadas. Por último, el análisis semántico también garantizaría que, si alguna función requiere devolver un valor, lo haga adecuadamente.

Verificación semántica 

Tomando en cuenta el ejemplo de la Figura 8, se va a verificar si las operaciones y asignaciones en el código son válidas según las reglas del lenguaje.

En la Figura 9, la tabla de símbolos es una estructura clave en el análisis semántico, ya que almacena información sobre los identificadores del programa. En este caso, se registró que edad es una variable de tipo entero declarada en el ámbito global. La tabla también incluye un campo para el valor inicial, que está vacío porque no se asignó un valor al declarar la variable. Durante el análisis semántico, el compilador consulta esta tabla para verificar que las operaciones realizadas con edad sean compatibles con su tipo. Esto asegura que la variable haya sido declarada correctamente antes de su uso y que no existan conflictos en su definición.

Figura 9. Tabla de símbolos. Elaboración propia en Canva.

En la Figura 10, se hace la verificación de operaciones, en la línea donde se asigna "veinte" a edad, el compilador revisa la tabla de símbolos y detecta que edad es de tipo entero. Dado que "veinte" es una cadena de texto, se produce un error de incompatibilidad de tipos. Este análisis previene errores en tiempo de ejecución, asegurando que las operaciones sean lógicas y acordes a las reglas del lenguaje. Para corregir este problema, se debe asignar a edad un valor compatible, como un número entero.

Figura 10. Verificación de Operaciones. Elaboración propia en Canva.

En la Figura 11, se observa el resultado del análisis semántico en el cual el compilador detectará un error semántico en la línea edad = "veinte"; porque el tipo de dato de la asignación no coincide con el tipo declarado para la variable edad. Para corregir este error, deberías asignar un valor numérico compatible con el tipo entero.

Figura 11. Resultado del Análisis Semántico. Elaboración propia en Canva.

Esto muestra cómo el análisis semántico actúa como un filtro que asegura la corrección lógica del programa antes de generarse el código intermedio. 

En la Figura 12, se muestra un diagrama de flujo sobre dónde encaja el análisis semántico en el proceso del compilador. El proceso de compilación incluye varias fases para convertir el código fuente en un programa ejecutable. Primero, el análisis léxico convierte el código en tokens, seguido del análisis sintáctico, que construye el árbol sintáctico para verificar la estructura gramatical. Luego, el análisis semántico asegura que el programa cumpla con las reglas lógicas y de tipos, mientras actualiza la tabla de símbolos con la información relevante. Finalmente, se genera el código intermedio, que será traducido a código ejecutable.

Figura 12. Flujo de análisis sintáctico y semántico en un compilador. Fuente: compiladoresasignatura.blogspot.com

Si aun tienes dudas, te dejo un video sobre el analizador semántico:

Mario H.[Mario Hernandez]. (2020, 10 de mayo). Analisis Semantico del Compilador [Video]. YouTube. https://www.youtube.com/watch?v=z7tAUJ2PHXM&t=1s

REFERENCIAS

Rivera, G. L. (2022, agosto 20). Análisis semántico - Gian Luca Rivera. Medium. https://medium.com/@LucaBia/an%C3%A1lisis-sem%C3%A1ntico-i-iii-762cc0d63fb0

(S/f). Sciencedirect.com. Recuperado el 28 de noviembre de 2024, de https://www.sciencedirect.com/topics/computer-science/semantic-analyzer

Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools (2nd ed.). Addison-Wesley.

In-, I. (s/f). Francisco Ortín Soler Juan Manuel Cueva Lovelle. Uniovi.es. Recuperado el 7 de diciembre de 2024, de https://reflection.uniovi.es/ortin/publications/semantico.pdf

Gerardo y Rodríguez García Silvino, A. C. J. J. E. H. E. I. G. R. G. G. N., & Perfil, V. T. mi. (s/f). Contenido de Compiladores. Blogspot.com. Recuperado el 7 de diciembre de 2024, de https://cursocompiladoresuaeh.blogspot.com/2010/11/unidad-vi-analisis-semantico.html

1.3.4. Análisis Semántico. (s/f). Edu.mx. Recuperado el 7 de diciembre de 2024, de https://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/134_anlisis_semntico.html


© 2024 Marissa Velásquez. Todos los derechos reservados.
Creado con Webnode Cookies
¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar