Este documento describe los errores léxicos y generadores de analizadores léxicos. Explica que los errores léxicos ocurren cuando el analizador léxico encuentra una secuencia de caracteres no válida, como símbolos no reconocidos o una secuencia incorrecta. También describe varios generadores de analizadores léxicos populares como Flex, JFlex, Python Lex y ANTLR, que automatizan la creación de analizadores léxicos mediante el uso de expresiones regulares.
1. LENGUAJES Y AUTOMATAS
4.4 Errores léxicos
4.5 generadores de analizadores léxicos
LENGUAJES Y
AUTOMATAS 1
RICARDO RAFAEL CARPIO
LÓPEZ
ISC
2. ERRORES LÉXICOS
Un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y
puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe
funcionar de manera tan eficiente como sea posible.
Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy restringida de un
programa fuente.
El compilador tiene que:
• Reportar clara y exactamente la presencia de errores
• Recuperarse de cada error lo suficientemente rápido para poder detectar errores subsiguientes:
• Tratar de evitar mensajes falsos de error.
• Un error que produce un token erróneo.
• Errores léxicos posibles.
3. Estos errores pueden ocurrir por varias razones, como:
• Símbolos no reconocidos: el autómata no tiene un estado que reconozca los símbolos que se están
leyendo.
• Secuencia incorrecta: la secuencia de caracteres no sigue las reglas del lenguaje del autómata.
• Errores de sintaxis: el autómata está mal diseñado y no puede reconocer secuencias de caracteres
válidas.
El analizador léxico lee el código fuente del programa y lo divide en componentes léxicos, como
identificadores, operadores, palabras clave, etc. Si el analizador léxico encuentra un error léxico,
informa al compilador para que lo analice y lo corrija.
Para evitar errores léxicos en autómatas, es importante seguir las reglas del lenguaje del autómata.
• Escribir código que siga las reglas del lenguaje del autómata.
• Utilizar un analizador léxico para detectar errores léxicos.
• Probar el autómata con una variedad de entradas para asegurarse de que funciona correctamente.
4. GENERADORES DE ANALIZADORES LÉXICOS
Un generador de analizador léxico es una herramienta que automatiza la creación de un
analizador léxico para un lenguaje de programación. Los analizadores léxicos son la primera fase
de un compilador, y se encargan de dividir el código fuente en componentes léxicos, como
identificadores, operadores, palabras clave, etc.
Los generadores de analizadores léxicos suelen utilizar expresiones regulares para definir los
componentes léxicos. Las expresiones regulares son una forma concisa de describir patrones de
caracteres. Por ejemplo, la expresión regular [0-9]+ define una secuencia de uno o más caracteres
numéricos.
Algunos ejemplos de generadores de analizadores léxicos son:
• Flex: un generador de analizadores léxicos para el lenguaje C.
• JFlex: una extensión de Flex para Java.
• Python Lex: un generador de analizadores léxicos para Python.
• ANTLR: un generador de analizadores léxicos, sintácticos y semánticos.
5. Flex: FLEX es el analizador de dominio
público compatible con el analizador
léxico más frecuentemente utilizado: LEX
(bajo sistema UNIX). FLEX (y LEX)
genera, dada una especificación correcta
de patrones y acciones, un programa en
lenguaje C que puede ser compilado para
obtener un programa ejecutable.
JFLex y CUP, son dos herramientas que
generan programas que reaccionen a una
entrada de datos con una estructura y un
lenguaje predeterminado. Como ejemplo se
pueden crear compiladores intérprete y
analizadores de línea de comando, dando una
opción a la solvencia necesitada.
Python Lex: Un programa de Python es
leído por un parser (analizador
sintáctico). Los datos introducidos en el
analizador son un flujo de tokens,
generados por el analizador léxico. Este
capítulo describe cómo el analizador
léxico desglosa un archivo en tokens.
ANTLR: una herramienta que da soporte a
todas las etapas del procesamiento de
lenguajes formales, permitiendo generar
analizadores léxicos, sintácticos, árboles de
sintaxis abstracta y analizadores de árboles
para el procesamiento semántico.