Ahora que hablamos sobre qué es un compilador, toca hablar sobre sus fases, este está divido en dos partes, el análisis(front-end) y la síntesis(back-end) (Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D., Compiladores: principios, técnicas y herramientas, 2006).
Análisis:
Analizador Léxico
El analizador léxico es la fase donde se analiza los tokens (unidad mínima de información en el programa fuente) que el usuario ingresa, los token pueden ser un valor, atributo, carácter o una cadena, estos tokens se "representan" por su tipo. El analizador léxico también verifica que los tokens sean válidos según las reglas del lenguaje, por ejemplo, si en lugar de CIRCLE se escribe CIRLE, el analizador podría arrojar un error porque esa palabra clave no existe. Aquí un ejemplo de un lenguaje que permite describir formas como círculos, triángulos y rectángulos mediante código(Figura 1) y al final su tabla de símbolos separándolo token por token en la Figura 2.
Este código podría representar un círculo con centro en (100, 100) y radio 50, un rectángulo con vértices definidos por las coordenadas dadas, y un triángulo con sus tres vértices en las posiciones especificadas. El compilador de este lenguaje se encargaría de interpretar estas instrucciones y dibujar las figuras geométricas correspondientes en pantalla.
CIRCLE 100 100 50
RECTANGLE 200 200 100 50
TRIANGLE 300 300 350 350 320 380
"Figura 1. Lenguaje que genera figuras geométricas"
"Fuente: Ham Gómez, G. (2024, 24 de noviembre). Herramienta Word."
El analizador léxico descompone el texto en los siguientes tokens:
CIRCLE→ Palabra clave que indica la figura geométrica a dibujar.100→ Número que representa la coordenada X del centro.100→ Número que representa la coordenada Y del centro.50→ Número que representa el radio del círculo.
¿Qué es un autómata?
Una vez tenido la tabla de símbolos del programa que quisiéramos podemos comprobar que funcione usando un autómata, un autómata es un modelo matemático que representa un sistema con estados finitos y transiciones entre ellos, utilizado para reconocer patrones o procesar cadenas de símbolos. A continuación haremos un autómata de nuestro lenguaje (Figura 3).
Inicio:
El autómata comienza en el estado inicial.
Según el primer carácter de la entrada, decide si está comenzando una palabra clave (C, R, T) o un número (dígito).
Reconocimiento de Palabras Clave:
Si el primer carácter es una letra (C, R, T), el autómata sigue la rama correspondiente para reconocer una de las palabras clave (CIRCLE, RECTANGLE, TRIANGLE).
Si al final de la secuencia de caracteres no se forma una palabra clave válida, se genera un error léxico.
Reconocimiento de Números:
Si el primer carácter es un dígito (0-9), el autómata se mueve al estado que reconoce números y continúa leyendo dígitos hasta que encuentra un separador (espacio o salto de línea).
Separadores:
Los espacios en blanco y los saltos de línea son ignorados por el autómata y no generan tokens.
Errores:
Cualquier carácter que no pertenezca a una palabra clave, número o separador genera un error léxico.
(Inicio)
|
+----> C ----> I ----> R ----> C ----> L ----> E ----> (CIRCLE)
|
+----> R ----> E ----> C ----> T ----> A ----> N ----> G ----> L ----> E ----> (RECTANGLE)
|
+----> T ----> R ----> I ----> A ----> N ----> G ----> L ----> E ----> (TRIANGLE)
|
+----> Dígito ----> (Número)
"Figura 3.El diagrama del autómata para nuestro lenguaje"
"Fuente: Ham Gómez, G. (2024, 24 de noviembre). Herramienta Word."
Si tienes más dudas sobre qué es un autómata, puedes checarlo aquí: Soto, R. (2010). Teoría de Autómatas y Compiladores [ICI-445]: Capítulo 1: Lenguajes y Gramáticas Formales. Escuela de Ingeniería Informática, Pontificia Universidad Católica de Valparaíso. https://zeus.inf.ucv.cl/~rsoto/assets/pdf/ICI/Cap1_ICI445.pdf
Analizador Sintáctico
El analizador sintáctico es la fase del compilador que se encarga de revisar la estructura del código, asegurándose de que las instrucciones estén organizadas y escritas correctamente según las reglas del lenguaje de programación. Esto lo logra utilizando la secuencia de los tokens generada por el analizador léxico formando un árbol sintáctico, este árbol representa la relación entre las distintas partes del código, y ayuda a verificar que las instrucciones estén ordenadas correctamente.
Si estamos trabajando con un lenguaje que genera figuras geométricas, el análisis sintáctico verificará que las instrucciones estén correctamente escritas de acuerdo con sus reglas gramaticales(Figura4). Ejemplo:
Un CIRCLE debe
estar seguido de tres números: CIRCLE <x>
<y> <radius>.
Un RECTANGLE debe
estar seguido de cuatro números: RECTANGLE
<x1> <y1> <width> <height>.
Un TRIANGLE debe estar seguido de seis
números: TRIANGLE <x1> <y1> <x2>
<y2> <x3> <y3>.
Un CIRCLE debe
estar seguido de tres números: CIRCLE <x>
<y> <radius>.
Un RECTANGLE debe
estar seguido de cuatro números: RECTANGLE
<x1> <y1> <width> <height>.
Un TRIANGLE debe estar seguido de seis
números: TRIANGLE <x1> <y1> <x2>
<y2> <x3> <y3>.
"Figura 4.Instrucciones escritas de acuerdo con nuestras reglas gramaticales"
"Fuente: Ham Gómez, G. (2024, 24 de noviembre). Herramienta Word."
El analizador sintáctico toma los tokens generados por el analizador léxico y construye una estructura que represente el significado del código. Por ejemplo, para el código:
CIRCLE 100 100 50
RECTANGLE 200 200 100 50
"Figura 5. Estructura que represente el código"
" Fuente: Ham Gómez, G. (2024, 24 de noviembre). Herramienta Word."
Para más información:
Hilario, S. M. (s.f.). Análisis sintáctico. Benemérita Universidad Autónoma de Puebla. https://www.cs.buap.mx/~hilario_sm/slide/compiladores/analisis%20sintactico%20.pdf
Videos de los temas vistos:
Referencias:
Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools (2nd Edition). Addison-Wesley.Soto, R. (2010). Teoría de Autómatas y Compiladores [ICI-445]: Capítulo 1: Lenguajes y Gramáticas Formales. Escuela de Ingeniería Informática, Pontificia Universidad Católica de Valparaíso. https://zeus.inf.ucv.cl/~rsoto/assets/pdf/ICI/Cap1_ICI445.pdf
Hilario, S. M. (s.f.). Análisis sintáctico. Benemérita Universidad Autónoma de Puebla. https://www.cs.buap.mx/~hilario_sm/slide/compiladores/analisis%20sintactico%20.pdf
Capítulo 5. Análisis semántico. (n.d.). http://arantxa.ii.uam.es/~alfonsec/docs/compila5.htm
De Guanajuato, U. (2022, September 24). Clase digital 14. Generación de código intermedio: Expresiones. Recursos Educativos Abiertos. https://blogs.ugto.mx/rea/clase-digital-14-generacion-de-codigo-intermedio-expresiones/