Análisis léxico (analizador) en diseño de compilador con ejemplo
¿Qué es el análisis léxico?
Análisis léxico Es la primera fase en el diseño del compilador. Un Lexer toma el código fuente modificado que está escrito en forma de oraciones. En otras palabras, te ayuda a convertir una secuencia de caracteres en una secuencia de tokens. El analizador léxico divide esta sintaxis en una serie de tokens. Elimina cualquier espacio adicional o comentario escrito en el código fuente.
Los programas que realizan análisis léxico en el diseño del compilador se denominan analizadores léxicos o lexers. Un lexer contiene tokenizador o escáner. Si el analizador léxico detecta que el token no es válido, genera un error. La función del analizador léxico en el diseño del compilador es leer flujos de caracteres del código fuente, verificar si hay tokens legales y pasar los datos al analizador de sintaxis cuando lo requiera.
Ejemplo
How Pleasant Is The Weather?
Vea este ejemplo de Análisis Léxico; Aquí podemos reconocer fácilmente que hay cinco palabras: Qué agradable es el clima. Esto es muy natural para nosotros ya que podemos reconocer los separadores, los espacios en blanco y el símbolo de puntuación.
HowPl easantIs Th ewe ather?
Ahora, mira este ejemplo, también podemos leer esto. Sin embargo, llevará algún tiempo porque los separadores se colocan en los lugares impares. No es algo que te llegue inmediatamente.
Terminologías básicas
¿Qué es un lexema?
Un lexema es una secuencia de caracteres que se incluyen en el programa fuente según el patrón coincidente de un token. No es más que una instancia de un token.
¿Qué es una ficha?
Los tokens en el diseño del compilador son la secuencia de caracteres que representa una unidad de información en el programa fuente.
¿Qué es el patrón?
Un patrón es una descripción que utiliza el token. En el caso de una palabra clave que se utiliza como token, el patrón es una secuencia de caracteres.
Analizador léxico Architecture: Cómo se reconocen los tokens
La tarea principal del análisis léxico es leer los caracteres de entrada en el código y producir tokens.
El analizador léxico escanea todo el código fuente del programa. Identifica cada token uno por uno. Los escáneres generalmente se implementan para producir tokens solo cuando lo solicita un analizador. Así es como funciona el reconocimiento de tokens en el diseño del compilador:
- "Obtener el siguiente token" es un comando que se envía desde el analizador al analizador léxico.
- Al recibir este comando, el analizador léxico escanea la entrada hasta encontrar el siguiente token.
- Devuelve el token a Parser.
Lexical Analyzer omite espacios en blanco y comentarios al crear estos tokens. Si hay algún error, el analizador léxico correlacionará ese error con el archivo fuente y el número de línea.
Funciones del analizador léxico
El analizador léxico realiza las siguientes tareas:
- Ayuda a identificar el token en la tabla de símbolos.
- Elimina espacios en blanco y comentarios del programa fuente.
- Correlaciona los mensajes de error con el programa fuente.
- Le ayuda a expandir las macros si se encuentran en el programa fuente.
- Leer caracteres de entrada del programa fuente
Ejemplo de análisis léxico, tokens y no tokens
Considere el siguiente código que se alimenta al Analizador léxico
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Ejemplos de Tokens creados
lexema | Token |
---|---|
int | Palabra clave |
máximas | Identificador |
( | Operator |
int | Palabra clave |
x | Identificador |
, | Operator |
int | Palabra clave |
Y | Identificador |
) | Operator |
{ | Operator |
If | Palabra clave |
Ejemplos de no tokens
Tipo | Ejemplos |
---|---|
Comentario | // Esto comparará 2 números |
Directiva de preprocesador | #incluye |
Directiva de preprocesador | #definir NUMEROS 8,9 |
Macro | NÚMEROS |
Espacio en blanco | /n /b /t |
Errores léxicos
Una secuencia de caracteres que no es posible escanear en ningún token válido es un error léxico. Datos importantes sobre el error léxico:
- Los errores léxicos no son muy comunes, pero conviene gestionarlos mediante un escáner.
- Los errores ortográficos de identificadores, operadores y palabras clave se consideran errores léxicos.
- Generalmente, un error léxico es causado por la aparición de algún carácter ilegal, mayoritariamente al principio de un token.
Recuperación de errores en el analizador léxico
A continuación, se muestran algunas de las técnicas de recuperación de errores más comunes:
- Elimina un carácter de la entrada restante
- En el modo pánico, los personajes sucesivos siempre se ignoran hasta llegar a una ficha bien formada.
- Insertando el carácter que falta en la entrada restante
- Reemplazar un personaje con otro personaje
- Transponer dos caracteres seriales
Analizador léxico frente a analizador
Analizador léxico | Analizador |
---|---|
Programa de entrada de escaneo | Realizar análisis de sintaxis |
Identificar fichas | Crear una representación abstracta del código. |
Insertar tokens en la tabla de símbolos | Actualizar entradas de la tabla de símbolos |
Genera errores léxicos | Genera un árbol de análisis del código fuente. |
¿Por qué separar Lexical y Parser?
- La simplicidad del diseño: facilita el proceso de análisis léxico y de sintaxis eliminando tokens no deseados.
- Para mejorar la eficiencia del compilador: le ayuda a mejorar la eficiencia del compilador
- Especialización: se pueden aplicar técnicas especializadas para mejorar el proceso de análisis léxico.
- Portabilidad: sólo el escáner necesita comunicarse con el mundo exterior
- Mayor portabilidad: peculiaridades específicas del dispositivo de entrada restringidas al lexer
Ventajas del análisis léxico
- El método del analizador léxico es utilizado por programas como compiladores que pueden usar los datos analizados del código de un programador para crear un código ejecutable binario compilado.
- Los navegadores web lo utilizan para formatear y mostrar una página web con la ayuda de datos analizados de JavaScript, HTML, CSS
- Un analizador léxico independiente le ayuda a construir un procesador especializado y potencialmente más eficiente para la tarea.
Desventaja del análisis léxico
- Debe dedicar mucho tiempo a leer el programa fuente y particionarlo en forma de tokens.
- Algunas expresiones regulares son bastante difíciles de entender en comparación con las reglas PEG o EBNF
- Se necesita más esfuerzo para desarrollar y depurar el lexer y sus descripciones de tokens.
- Se requiere una sobrecarga de tiempo de ejecución adicional para generar las tablas Lexer y construir los tokens.
Resum
- El análisis léxico es la primera fase en el diseño del compilador.
- Los lexemas y los tokens son la secuencia de caracteres que se incluyen en el programa fuente según el patrón coincidente de un token.
- Se implementa un analizador léxico para escanear todo el código fuente del programa.
- El analizador léxico ayuda a identificar el token en la tabla de símbolos
- Una secuencia de caracteres que no es posible escanear en ningún token válido es un error léxico
- Elimina un carácter de la entrada restante, es útil. Método de recuperación de errores.
- El analizador léxico escanea el programa de entrada mientras el analizador realiza el análisis de sintaxis
- Facilita el proceso de análisis léxico y de sintaxis eliminando tokens no deseados.
- Los navegadores web utilizan el analizador léxico para formatear y mostrar una página web con la ayuda de datos analizados de JavsScript, HTML, CSS.
- El mayor inconveniente de utilizar el analizador léxico es que necesita una sobrecarga de tiempo de ejecución adicional para generar las tablas Lexer y construir los tokens.