Analizador Léxico - juanpflores/AutoFu GitHub Wiki
Un analizador léxico o lexicográfico su principal objetivo es convertir una cadena caracteres en una tabla de tokens. Normalmente a los programas que realizan ese tipo de acciones se les conoce como tokenizadores o scanners
¿Qué es un Token y Tokenización?
Un token es una estructura que nos muestra de manera explicita la categoría de una lexema. En ciencias de la computación se le dice lexema a una palabra aunque en muchos casos esto genera confusión ya que en linguística tiene un significado distinto. Si quisiéramos ser más precisos deberíamos llamarlo morfema, sin embargo, mantendremos lexema.
La categoría del lexema se establece en base a las categorías gramaticales del lenguaje. Por ejemplo, imaginemos que tenemos la siguiente expresión en lenguaje C:
suma = 3 + 2;
Nuestra tabla de token nos quedaría de la siguiente forma:
| Lexema | Categoría del Token |
|---|---|
| suma | Identificador |
| = | Operador de Asignación |
| 3 | Literal de Entero |
| + | Operador de Adición |
| 2 | Literal de Entero |
| ; | Fin de Cadena |
A este proceso se le conoce como tokenización. Algo que se debe de considerar al momento de crear un analizador es la forma en la que se van a tomar los espacios en blanco y los comentarios.
En estos casos, debemos de asegurarnos de tenerlos en nuestra gramática y después los podemos ignorar de tal forma que no generen ningún token en nuestra tabla. Sin embargo, quizas haya casos donde no debamos de ignorar el espacio en blanco. En el caso de Python no podemos ignorar las tabulaciones porque nos generaría errores.
Scanner
El scanner es el primer paso del análisis léxico y usualmente esta conformado por una maquina finita de estados. Tiene codificado en su interior información sobre las posibles secuencias de caracteres que pueden estar contenidas en cualquiera de las fichas que maneja (las instancias individuales de estas secuencias de caracteres se conocen como lexemas). Por ejemplo, un token entero puede contener cualquier secuencia de caracteres numéricos.
Imaginemos que tenemos la siguiente expresión en C:
valor_neto_futuro = (activos - pasivos);
La tabla de tokens quedaría así:
| Lexema | Categoría del Token |
|---|---|
| valor_neto_futuro | IDENTIFICADOR valor_neto_futuro |
| = | IGUAL |
| ( | PARENTESIS ABIERTO |
| activos | IDENTIFICADOR activos |
| - | MENOS |
| pasivos | IDENTIFICADOR pasivos |
| ) | PARENTESIS CERRADO |
| ; | PUNTOYCOMA |
Como se puede ver, se quitan los espacios en blanco y los caracteres especiales no tienen un valor especifico.
Evaluador
Un lexema es sólo una cadena de caracteres que se sabe que son de cierto tipo (por ejemplo, una cadena literal, una secuencia de letras). Para construir un token, el analizador léxico necesita una segunda etapa, el evaluador, que recorre los caracteres del lexema para producir un valor. El tipo de lexema combinado con su valor es lo que constituye apropiadamente un token, que puede ser dado a un analizador.
Algunos tokens como paréntesis no tienen valores, por lo que la función de evaluador para estos no puede devolver nada: solo se necesita el tipo. Del mismo modo, a veces los evaluadores pueden suprimir un lexema por completo, ocultándolo del analizador, que es útil para espacios en blanco y comentarios. Los evaluadores de identificadores suelen ser sencillos (representando literalmente el identificador), pero pueden incluir un poco de rozamiento.
Los evaluadores de literales enteros pueden pasar la cadena (retrasando la evaluación a la fase de análisis semántico), o pueden realizar la evaluación ellos mismos, que pueden estar involucrados para diferentes bases o números de coma flotante.