JavaCUP - Análisis Léxico: JLEX

JLex

JLex es un generador de analizadores léxicos. Esto significa, que JLex es capaz de generar automáticamente un analizador léxico a partir de una especificación léxica del lenguaje, lo cual libra al usuario de la tarea de diseñar el analizador léxico.
Un analizador léxico toma como entrada una cadena de caracteres y la transforma en una secuencia de tokens. JLex toma como entrada un archivo con una especificación exp, y con ella crea un archivo fuente Java exp.lex.java correspondiente al analizador léxico, que tras ser compilado da como resultado el analizador Yylex.class.


Especificaciones JLex

Las especificación JLex están organizadas en tres secciones, separadas por la directiva "%%", como se muestra a continuación:

código de usuario
%%
directivas JLex
%%
reglas de expresiones regulares

La directiva "%%" distingue las diferentes secciones y debe ser ubicada en el comienzo de la línea, y el espacio restante de dicha línea debería permanecer en blanco.

Código de Usuario
La sección de código de usuario, contiene el código que se desea incluir al comienzo del archivo de salida (exp.lex.java en el gráfico), tal como el paquete en el que se desea almacenar Yylex, o las clases que se importarán. Esta área de la especificación provee espacio para la implementación de clases de utilidad o de tipos de retorno.
Directivas JLex
La sección de directivas JLex es la segunda parte del archivo de entrada. En ella se declaran las definiciones de macros y los nombres de los estados. Cada directiva JLex debería estar contenida en una línea simple y debería comenzar esa línea.
Reglas de Expresiones Regulares
La sección de reglas de expresiones regulares es la tercera y última parte de la especificación, y contiene las reglas necesarias para el análisis léxico; las reglas tienen tres partes diferentes: una lista opcional de estados léxicos, una expresión regular, y la acción asociada. Tal formato, puede representarse como sigue:

[<states>] <expression> { <action> }

Estas reglas son las que permiten dividir la secuencia de caracteres de entrada en una secuencia de tokens. Estas reglas especifican las expresiones regulares, y les asocian acciones escritas con código fuente Java

Reconocimiento de Tokens

Si la entrada coincide con más de una regla, el analizador resuelve el conflicto entre las reglas, escogiendo la regla que reconoce la cadena más larga, y en caso de que, a su vez, haya varias reglas que reconocen cadenas de la misma longitud máxima, elige la regla que aparece primero en la especificaicón. Entonces, las reglas que aparecen primero en la especificación son las que tienen mayor prioridad en el scanner generado.

Para evitar errores, causados por el no reconocimiento de una entrada, ya sea porque se omitió alguna regla del lenguaje, o porque la entrada no pertenece al lenguaje, debe agregarse al final de la especificación de las reglas, la siguiente claúsula:

. { java.lang.System.out.println("Unmatched input: " + yytext()); }

donde el punto reconoce cualquier entrada excepto la línea nueva.