Primera fase de un compilador

Un analizador léxico (o scanner) tiene como función principal en leer el código fuente y dividirlo en componentes básicos llamados tokens. Los tokens son unidades mínimas de significado en un lenguaje de programación, como palabras clave, identificadores, operadores, números, símbolos de puntuación, etc. 

Para entrar en más detalle:

En la Figura 2, El programa mostrado ejemplifica la funcionalidad básica de un mini lenguaje en español inspirado en C. Define una variable x de tipo entero, lee su valor desde la entrada estándar, verifica si el valor es mayor a 0 utilizando una estructura condicional y, en caso afirmativo, imprime el mensaje "x es positivo". Este ejemplo demuestra el uso de palabras reservadas como inicio, si, entonces y fin, además de funciones como leer e imprimir.

Figura 2. Programa en mini lenguaje inspirado en C. La imagen muestra la estructura básica del programa, incluyendo variables, entrada/salida y control de flujo. Elaboración propia en Canva.

En la Figura 3La tabla muestra la descomposición léxica de un programa escrito en un mini lenguaje en español inspirado en C. Cada elemento del código fuente se clasifica en un token específico y se describe su categoría correspondiente, como palabras reservadas, identificadores, constantes o símbolos especiales. Esta representación es útil para entender cómo el analizador léxico interpreta el código.

Figura 3. Tabla de tokens del programa en mini lenguaje. La imagen detalla los tokens reconocidos y su categoría dentro del programa analizado. Elaboración propia en Canva.

Luego se hace uso de lenguajes formales para evaluar los tokens, son aquellas que se utilizan para definir patrones de texto que representan los diferentes tipos de tokens. Se muestran como ejemplo algunas de las expresiones regulares del lenguaje correspondiente que hicimos uso en la Figura 2:

Identificadores: [a-zA-Z_][a-zA-Z0-9_]*

  • [a-zA-Z_]: El identificador debe comenzar con una letra minúscula, mayúscula o un guión bajo.
  • [a-zA-Z0-9_]*: Después del primer carácter, pueden seguir cero o más letras, números o guiones bajos.

Números enteros: -?[0-9]+

  • -?: Opcionalmente, puede haber un signo menos al inicio del número.
  • [0-9]+: Debe haber uno o más dígitos del 0 al 9. 

Se hará uso de los autómatas finito determinista (AFD), el cual se va a encargar de reconocer cualquier palabra que siga la estructura de las expresiones regulares.

En la Figura 4, se presenta un autómata finito determinista (AFD) diseñado para validar identificadores en lenguajes de programación. El autómata identifica si una cadena cumple con las reglas para ser un identificador válido, comenzando con una letra o un guión bajo (_), y seguido opcionalmente de letras, números o guiones bajos. La tabla de transiciones detalla cómo los estados cambian en función del símbolo de entrada, mientras que el diagrama ilustra visualmente el flujo entre estados, desde el inicial hasta el estado de aceptación. Este modelo es clave para los analizadores léxicos que procesan el código fuente. 

Figura 4. Autómata finito determinista para validar identificadores, mostrando sus estados, transiciones y tabla de transición. Elaboración propia en Canva.

En la Figura 5, se muestra un autómata finito determinista (AFD) diseñado para validar números enteros. Este autómata permite identificar cadenas que representan enteros válidos, los cuales pueden estar precedidos opcionalmente por un signo negativo (-). El autómata comienza en el estado inicial (q0), transiciona al estado q1 al leer un signo negativo y llega al estado de aceptación (q2) al procesar una secuencia de dígitos del 0 al 9. La tabla de transiciones complementa el diagrama visual al detallar los cambios de estado en función de los símbolos de entrada, facilitando la comprensión del proceso de validación.

Figura 5. Autómata finito determinista para validar números enteros, con representación gráfica y tabla de transiciones. Elaboración propia en Canva.

Un autómata finito determinista (AFD) es un modelo matemático que se utiliza para reconocer patrones en cadenas de símbolos. Se compone de un conjunto finito de estados, un alfabeto de símbolos de entrada, una función de transición de estados, un estado inicial y un conjunto de estados de aceptación. Universidad Tecnológica Nacional. (s.f.). Departamento de Ingeniería en Sistemas de Información. [Institucional]. Recuperado de https://www.institucional.frc.utn.edu.ar/sistemas/  

En el siguiente video, podrás consultar sobre los autómatas, entrando a detalle sobre qué son y cómo se usan:

[Codemath ]. (2024, 24 de febrero). Qué es un Autómata Finito Determinista (AFD) [Video]. YouTube. https://www.youtube.com/watch?v=d9aEE-uLmNE

Herramientas para desarrollar un analizador léxico.

Un analizador léxico es una componente fundamental en la construcción de compiladores e intérpretes. Su función principal es dividir el código fuente en unidades léxicas (tokens) significativas.

Existen diversas herramientas que facilitan el desarrollo de analizadores léxicos, cada una con sus propias características y ventajas. A continuación, te presentaré algunas de las más populares:

Herramientas Clásicas:

Lex/Flex:

  • Una de las herramientas más utilizadas y ampliamente conocidas.
  • Permite definir patrones léxicos utilizando expresiones regulares y genera automáticamente un analizador léxico en C.
  • Ofrece gran flexibilidad y eficiencia.

Herramientas Modernas y de Alto Nivel:

ANTLR:

  • Una herramienta versátil que genera analizadores léxicos y sintácticos para diversos lenguajes de programación.
  • Ofrece un enfoque más moderno y orientado a objetos.
  • Soporta múltiples lenguajes de salida, incluyendo C++, Java, Python y otros.

JavaCC:

  • Especializada en la generación de analizadores léxicos y sintácticos para Java.
  • Integrada con el ecosistema Java y ofrece una sintaxis similar al lenguaje Java.

SLR(1):

  • Ofrece una interfaz sencilla y una buena documentación.
  • Una herramienta de código abierto que permite generar analizadores léxicos y sintácticos a partir de gramáticas SLR(1).

REFERENCIAS

Wuerdig, R., Maciel, V., Reis, R., & Bampi, S. (2023). LEX - A Cell Switching Arcs Extractor: A Simple SPICE-Input Interface for Electrical Characterization. 2023 IEEE Computer Society Annual Symposium on VLSI (ISVLSI), 1-6. https://doi.org/10.1109/ISVLSI59464.2023.10238671.

Análisis léxico - Compilador. (2024). Análisis léxico. Recuperado el 16 de noviembre de 2024, de https://www.scribd.com/document/785726986/analisis-lexico

Flores, J. R. (2019, July 22). ¿Como funciona un compilador? Usuario Peru TI; Jorge Rodriguez Flores. https://usuarioperu.com/2019/07/22/como-funciona-un-compilador/

Guando, M. (2018, May 21). Expresiones Regulares. Maximo Guando Quispe; Máximo Guando Quispe. https://maximoguando.com/javascript/expresiones-regulares/

Invarato, R. (2015, February 8). Expresiones regulares - Regexp - Pattern matching. Jarroba. https://jarroba.com/busqueda-de-patrones-expresiones-regulares/

Analizador léxico. (n.d.). Ecured.cu. Retrieved November 17, 2024, from https://www.ecured.cu/Analizador_l%C3%A9xico


© 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