Diseño del compilador: análisis léxico
El análisis léxico es la primera fase de un compilador. Toma el código fuente modificado de los preprocesadores del lenguaje que están escritos en forma de oraciones. El analizador léxico divide estas sintaxis en una serie de tokens, eliminando cualquier espacio en blanco o comentarios en el código fuente.
Si el analizador léxico encuentra un token no válido, genera un error. El analizador léxico trabaja en estrecha colaboración con el analizador de sintaxis. Lee los flujos de caracteres del código fuente, busca tokens legales y pasa los datos al analizador de sintaxis cuando lo requiere.
Tokens
Se dice que los lexemas son una secuencia de caracteres (alfanuméricos) en una ficha. Hay algunas reglas predefinidas para que cada lexema sea identificado como un token válido. Estas reglas se definen mediante reglas gramaticales, mediante un patrón. Un patrón explica qué puede ser un token y estos patrones se definen mediante expresiones regulares.
En el lenguaje de programación, las palabras clave, constantes, identificadores, cadenas, números, operadores y símbolos de puntuación pueden considerarse tokens.
Por ejemplo, en lenguaje C, la línea de declaración de variable
int value = 100;
contiene los tokens:
int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).
Especificaciones de tokens
Entendamos cómo la teoría del lenguaje asume los siguientes términos:
Alfabetos
Cualquier conjunto finito de símbolos {0,1} es un conjunto de alfabetos binarios, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} es un conjunto de alfabetos hexadecimales, {az, AZ} es un conjunto de alfabetos en inglés.
Instrumentos de cuerda
Cualquier secuencia finita de alfabetos se llama cadena. La longitud de la cadena es el número total de apariciones de alfabetos, por ejemplo, la longitud de la cadena tutorialspoint es 14 y se indica con | tutorialspoint | = 14. Una cadena que no tiene alfabetos, es decir, una cadena de longitud cero se conoce como cadena vacía y se indica con ε (épsilon).
Símbolos especiales
Un lenguaje típico de alto nivel contiene los siguientes símbolos: -
Símbolos aritméticos | Suma (+), Resta (-), Módulo (%), Multiplicación (*), División (/) |
Puntuación | Coma (,), punto y coma (;), punto (.), Flecha (->) |
Asignación | = |
Asignacion especial | + =, / =, * =, - = |
Comparación | ==,! =, <, <=,>,> = |
Preprocesador | # |
Especificador de ubicación | Y |
Lógico | &, &&, |, ||,! |
Operador de turno | >>, >>>, <<, <<< |
Idioma
Un idioma se considera como un conjunto finito de cadenas sobre un conjunto finito de alfabetos. Los lenguajes informáticos se consideran conjuntos finitos y se pueden realizar operaciones con conjuntos matemáticos en ellos. Los lenguajes finitos se pueden describir mediante expresiones regulares.
Regla de coincidencia más larga
Cuando el analizador léxico lee el código fuente, escanea el código letra por letra; y cuando encuentra un espacio en blanco, un símbolo de operador o símbolos especiales, decide que una palabra está completa.
For example:
int intvalue;
Mientras escanea ambos lexemas hasta 'int', el analizador léxico no puede determinar si es una palabra clave int o las iniciales del valor int del identificador.
La regla de coincidencia más larga establece que el lexema escaneado debe determinarse en función de la coincidencia más larga entre todos los tokens disponibles.
El analizador léxico también sigue rule prioritydonde una palabra reservada, por ejemplo, una palabra clave, de un idioma tiene prioridad sobre la entrada del usuario. Es decir, si el analizador léxico encuentra un lexema que coincide con cualquier palabra reservada existente, debería generar un error.