El documento describe el uso de JLex para generar analizadores léxicos en Java. JLex toma una especificación léxica que divide en tres secciones: código de usuario, directivas JLex y reglas de expresiones regulares. A partir de la especificación, JLex genera un analizador léxico en Java que reconoce tokens en una cadena de entrada según las reglas definidas. El documento incluye un ejemplo completo de la especificación y el código Java necesario para ejecutar el analizador generado.
0 calificaciones0% encontró este documento útil (0 votos)
58 vistas10 páginas
El documento describe el uso de JLex para generar analizadores léxicos en Java. JLex toma una especificación léxica que divide en tres secciones: código de usuario, directivas JLex y reglas de expresiones regulares. A partir de la especificación, JLex genera un analizador léxico en Java que reconoce tokens en una cadena de entrada según las reglas definidas. El documento incluye un ejemplo completo de la especificación y el código Java necesario para ejecutar el analizador generado.
El documento describe el uso de JLex para generar analizadores léxicos en Java. JLex toma una especificación léxica que divide en tres secciones: código de usuario, directivas JLex y reglas de expresiones regulares. A partir de la especificación, JLex genera un analizador léxico en Java que reconoce tokens en una cadena de entrada según las reglas definidas. El documento incluye un ejemplo completo de la especificación y el código Java necesario para ejecutar el analizador generado.
El documento describe el uso de JLex para generar analizadores léxicos en Java. JLex toma una especificación léxica que divide en tres secciones: código de usuario, directivas JLex y reglas de expresiones regulares. A partir de la especificación, JLex genera un analizador léxico en Java que reconoce tokens en una cadena de entrada según las reglas definidas. El documento incluye un ejemplo completo de la especificación y el código Java necesario para ejecutar el analizador generado.
Descargue como PDF, TXT o lea en línea desde Scribd
Descargar como pdf o txt
Está en la página 1de 10
Tutorial Jlex
Procesadores del Lenguaje
Roberto de la Torre Rivero Exp: 20212658 Introduccin
El Jlex es una generador de analizadores lxicos diseado para Java. JLex es capaz de generar automticamente un analizador lxico a partir de una especificacin lxica del lenguaje. Un analizador lxico toma como entrada una cadena de caracteres y la transforma en una secuencia de tokens. JLex toma como entrada un archivo con una especificacin y con ella crea un archivo fuente Java correspondiente al analizador lxico, que tras ser compilado da como resultado el analizador. Archivo de especificacin
Las especificacin JLex estn organizadas en tres secciones, separadas por la directiva "%%", como se muestra a continuacin: cdigo de usuario %% directivas JLex %% reglas de expresiones regulares La directiva "%%" distingue las diferentes secciones y debe ser ubicada en el comienzo de la lnea, y el espacio restante de dicha lnea debera permanecer en blanco.
Cdigo de usuario La seccin de cdigo de usuario, contiene el cdigo que se desea incluir al comienzo del archivo de salida, tal como el paquete en el que se desea almacenar, o las clases que se importarn. Esta rea de la especificacin provee espacio para la implementacin de clases de utilidad o de tipos de retorno. Directivas JLex La seccin 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 debera estar contenida en una lnea simple y debera comenzar esa lnea. Reglas de Expresiones Regulares La seccin de reglas de expresiones regulares es la tercera y ltima parte de la especificacin, y contiene las reglas necesarias para el anlisis lxico; las reglas tienen tres partes diferentes: una lista opcional de estados lxicos, una expresin regular, y la accin 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 cdigo fuente Java
Reconocimiento de Tokens Si la entrada coincide con ms de una regla, el analizador resuelve el conflicto entre las reglas, escogiendo la regla que reconoce la cadena ms larga, y en caso de que, a su vez, haya varias reglas que reconocen cadenas de la misma longitud mxima, elige la regla que aparece primero en la especificaicn. Entonces, las reglas que aparecen primero en la especificacin 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 especificacin de las reglas, la siguiente clasula: . { java.lang.System.out.println("Unmatched input: " + yytext()); } donde el punto reconoce cualquier entrada excepto la lnea nueva.
Ejemplo: Primeros pasos:
Debemos tener instalado J2SE(TM) Development Kit Descargamos JLex de su pgina: http://www.cs.princeton.edu/~appel/modern/java/JLex/ Source Code: Main.java Creamos una carpeta en el directorio de Jdk en LIB con el nombre de JLex y copiamos el archivo Main.java del JLEX a esta carpeta A continuacin compilamos este archivo y tendremos la clase Jlex Javac Main.java Resultado: Main.class Archivo de especificacin:
Lo llamaremos especificacin.lex Cdigo de usuario: Definimos la libreras import java.lang.System; y la clase yytoken que es la que devolver los datos del token encontrado: class Yytoken { Yytoken (int numToken,String text, String compo, int line, int charBegin){ //Contador para el nmero de tokens reconocidos m_numToken = numToken; //String del token reconocido m_text = new String(text); //Tipo de componente lxico encontrado m_compo = compo; //Nmero de linea m_line = line; //Columna donde empieza el primer carcter del token m_charBegin = charBegin; } //Mtodos de los atributos de la clase public int m_numToken; public String m_text; public String m_compo; public int m_line; public int m_charBegin; //Metodo que devuelve los datos necesarios que escribiremos en un archive de salida public String toString() { return "Token #"+m_numToken+": "+m_text+" C.Lexico: "+m_compo+" Line: "+m_line+" Column: "+m_charBegin; } }
Directivas JLex %% //permite cambiar el nombre de la funcin de yylex que reconoce los tokens (next token) %function nextToken //permite cambiar el nombre de la clase del analizador lxico, desde Yylex. %class Analizador //se define in integer para el contador de tokens %{ private int contador; %} //con init inicializamos variables %init{ contador = 0; %init} //fin de fichero %eof{ %eof} //Activa el contador de lneas, almacena en al variable entera yyline el ndice de la primera //lnea del token reconocido %line //activa el contador de caracteres, por defecto desactivado, almacena en al variable entera yychar el ndice del primer caracter del token reconocido %char
Expresiones regulares acciones
//Definimos los patrones para los tipos de datos a reconocer requeridos EXP_ALPHA=[A-Za-z] EXP_DIGITO=[0-9] EXP_ALPHA_NUMERIC={EXP_ALPHA}|{EXP_DIGITO}
//Acciones a realizar cuando encontramos un token que concuerda con el patrn //en cada caso delvemos una instancia de la clase yytoken con los datos requeridos para escribirlos en una archivo de salida //contador // yytext //componenete lxico //yyline /yychar
{NUMERO_HEX} { contador++; return new Yytoken(contador, yytext(),"Hexadecimal", yyline, yychar); }
{NUMERO_ENTERO} { contador++; return new Yytoken(contador, yytext(),"Entero", yyline, yychar); }
{NUMERO_OCTAL} { contador++; return new Yytoken(contador, yytext(),"Octal", yyline, yychar); }
{IDENTIFICADOR} { contador++; return new Yytoken(contador, yytext(),"Identificador", yyline, yychar); } {NUMERO} { contador++; return new Yytoken(contador, yytext(),"Numero", yyline, yychar); } //Se podrn definir mas acciones para diferentes situaciones o patrones encontrados como salto de lnea, fin de fichero, caracteres de puntuacin. " " { } [\n] { } [\t\r] { }
Ahora crearemos la clase principal en java que realizara la lectura del archivo entrada.txt, ordenar al analizador reconocer los tokens, y la salida ser escrita en un archivo de salida.txt
public static void main(String argv[]) throws IOException{
stdOut.println("------------------------------------------------------"); stdOut.println("Escriba el nombre del archivo a analizar"); stdOut.println("------------------------------------------------------");
stdErr.flush(); nombre = stdIn.readLine();
filein = open(nombre);
filereader = CrearFileReader(filein);
alexico(filereader); System.out.println("Se ha creado un archivo de salida.txt con el resultado");
//Creamos la instancia de la clase analizador (yylex) Analizador sampleLex = new Analizador(fichero); Yytoken token = null; String buff;
do{ try{ //como hemos renombrado el metodo en las directivas ahora es nextToken token = sampleLex.nextToken(); }catch(java.io.IOException e){
System.out.println("Error en nextToken()"); } //Mientras no este vacio if (token!=null) //Escribimos en fichero
Salida(token);
}while(token!=null); } }
Pasos para ejecutar la aplicacin:
1. Primero compilamos el archivo de especificacion.txt con JLex: java JLex.Main especificacin.lex
2. Obtendremos el archivo especificacin.lex.java que debemos compilar con javac
especificacion.lex.java
javac especificacin.lex.java
Si todo ha ido bien, obtendremos las clases especificadas en el archivo:
Yytoken.class Analizador.class
3. Ahora compilamos el archivo Jlex.java con nuestro cdigo que utiliza estas clases:
Javac Jlex.java
Obtendremos el class: Jlex.class
4. Ejecutamos el archivo generado con:
Java Jlex
Se mostrara el programa principal, pidindonos el archivo de entrada con los caracteres a reconocer. Este archivo debe de localizarse en el directorio donde estn estos archivos (src)
A continuacin el programa abrir el fichero, leer su contenido y lo pasar al analizador, cuando s e encuentre una coincidencia definida en nuestro archivo de especificacin lo escribir en un archivo de salida con la informacin tambin definida en este archivo de especificacin.
En el directorio de nuestro archivos encontraremos un archivo llamado salida.txt
salida.txt
En este archivo se encuentra la informacin sobre los tokens encontrados, componente lxico, lnea y columna.
En nuestro caso se nos peda que reconociese los tokens de ENTEROS, HEXDECIMALES, OCTALES e IDENTIFICADORES, podemos comprobar con diferentes archivo de entrada que funciona correctamente.
Se puede completar el sistema, aadiendo al archivo de espeficicacion.lex ms conjuntos de expresiones regulares y patrones para reconocer diferentes tipos de tokens, caracteres, simboles etc