Este es un ejemplo de como usar JLex sin Cup, es decir sin usar una gramática, espero que les pueda ayudar.
Vamos a crear un archivo .jlex que contendrá nuestro scanner, eso lo creamos en una carpeta por ejemplo en C:\Ejemplo. También necesitamos copiar las carpetas JLex que tenemos en nuestra carpeta del jdk\bin que compilamos anteriormente y pegarlas en la carpeta Ejemplo que acabamos de crear.
El código del archivo jlex nos reconocerá entradas para una calculadora simple, el código es el siguiente:
import java.lang.System; /* Esta clase llama a la clase Yylex y pasa como parametro un archive de entrada o algo introducido por el usuario desde consola */ class Analex { while (yy.yylex() != null) {} } } class Yytoken { Yytoken () {} } %% /*Directivas de JLex */ %eofval{ %eofval} %line //defnimos el uso de contador de lineas %char //definimos el uso de contador de caracteres /*creamos un estado llamado COMENTARIO, existe un estado por default que se llama YYINITIAL */ %state COMENTARIO NUMBER = [1-9][0-9]* %% /* Las acciones se hacen dentro de los {} y escritas en java */{NUMBER} { System.out.println ("NUMERO "); } "+" { System.out.println ("MAS ");} "-" { System.out.println ("MENOS "); } "*" { System.out.println ("POR "); } "/" { System.out.println ("DIV "); } "(" { System.out.println ("PARA "); } ")" { System.out.println ("PARC "); } ";" { System.out.println ("PUNTOCOMA "); } " " {System.out.println ("ESPACIO ");} /* cuando tenemos “//”, se pasa al estado COMENTARIO */"//" {yybegin(COMENTARIO);} [^\n] {} /* cuando tenemos un enter y estamos en el estado comentario, nos pasamos nuevamente al estado inicial */[\n] {yybegin(YYINITIAL); yychar=0;} /* En la siguiente linea se defnine lo que se hace en caso de que no venga nada de lo que hemos definido arriba, que es cuando ocurre un error lexico, yyline es el contador de linea, yychar es el contador de caracteres, que lo inicializamos a 0 para que reinicie cada vez que encuentre un enter */.|\n { if(!(yytext().equals("\n"))) yychar=0;}
Ahora sí, ya teniendo todo esto, compilamos con el siguiente comando
java JLex.Main léxico.jlex
Si existe algún error, nos lo mostrara en la consola, en este caso no existe ningún error por lo que nos genera un archivo que se llama léxico.jlex.java, que tenemos que renombrar como Yylex.java. La verdad, renombrarlo a Yylex no es importante, pero si no lo renombramos, usar el nombre original cuando compilemos en los pasos más adelante.
Para renombrar el archivo desde consola usamos el comando
rename lexico.jlex.java Yylex.java
Muchas veces tienes que modificar tu código del .jlex, cada vez que lo modifiques hay que compilar y renombrar nuevamente, pero no puedes renombrar a YYlex.java si existe este archivo, por lo que se tiene que eliminar el archivo Yylex.java con el siguiente comando
del Yylex.java
Todo este proceso se puede observar en la siguiente imagen
Esto nos genera archivos .class que se utilizaran al ejecutar el Analex
Ahora ya tenemos todo listo, para probar nuestro parser, vamos a crear un archivos de entrada con varias líneas de entrada, por ejemplo
3+2; // Este es un comentario
5+3)/2; //otro comentario
2+8/4;
// otro comentario ()**^
6*2+8;
Guardamos este archivo como entrada.txt que es el que le pasamos al Analex como parámetro, para eso usamos el siguiente comando
java Analex 0<entrada.txt
Como salidas obtendremos lo que para nosotros representa cada lexema de entrada (Numero, Operador, etc) que llamaremos Tokens. Estos Tokens son los que usara cup, en el siguiente post veremos como usar cup y pasar estos Tokens para que los utilice.
Si en el archivo de entrada existe un carácter que no lo reconoce nuestro lenguaje, nos mostrar un error léxico, mostrando la fila y columna donde encontró el error.
Como es tedioso en escribir todos los comandos para compilar cada vez que haces una modificación a tu archivo .jlex, se puede crear un script, para que al dar doble clic, lo ejecute y el proceso sea mas rápido. Para eso pega las siguientes instrucciones en un archivo y guardarlo como compilar.bat
java JLex.Main lexico.jlex
pause
DEL Yylex.java
rename lexico.jlex.java Yylex.java
pause
javac -d . Yylex.java
pause
Igual para ejecutar nuestro proyecto, podemos usar un archivo .bat para que se ejecute al darle doble ckik, guardamos el archivo como ejecutar.bat, las instrucciones dentro de este archivo son los siguientes:
java Analex 0<entrada.txt
pause
Como puedo usar de esta forma el JLex con NetBeans?, lo que deseo es agregar Yylex.java a mis librerias y pasarle como parametro el valor de un jtextfield
ResponderEliminarMuchas gracias ya lo he hecho correr, solo una duda por que cuando lo corremos se le pone un <0 ?
ResponderEliminarGracias por los ejemplos, me han sido de mucha ayuda!!!!
ResponderEliminarsolo tengo una duda, la creación de la clase Yytoken siempre se hace?
Lo que pasa es que en un ejemplo que me proporcionaron no incluyen esa clase y si corre bien, pero al hacer un ejercicio propio tomando como base ese ejemplo que te comento, me da un error y cabal es ese de crear la clase Yytoken. Que función tiene realmente este Yytoken y por qué se dará eso que te comento? que en un ejemplo si funciona mientras que en el otro no?