Análisis Léxico Usando JFlex

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Jonathan

Jonathan
Jonathan Búcaro
Búcaro
Búcaro
Developer | Planeswalker

Análisis Léxico usando JFlex

Al realizar una tarea sobre el Análisis Léxico, me pude dar cuenta lo difícil que es encontrar un ejemplo
que muestre como utilizar la herramienta JFlex. En casi la totalidad de los ejemplos, se realiza en
conjunto el análisis sintáctico

En esta publicación se dejará constancia de un ejemplo sencillo de cómo realizar un análisis léxico con
JFlex.

Como requisito para este ejemplo, se debe tener Java y JFlex instalado y configurado correctamente.

Crear la clase TokenPersonalizado con el siguiente código:

1 // Clase que será utilizada para devolver los tokens


2 public class TokenPersonalizado {
3  
4   String _token;
5   String _lexema;
6  
7   public String getLexema(){
8     return this._lexema;
9   }
10  
11   public String getToken(){
12     return this._token;
13   }
14  
15   TokenPersonalizado (String lexema, String token){
16     this._lexema = lexema;
17     this._token = token;
18   }
19  
20   public String toString(){
21     return "Lexema: " + this._lexema + " Token: " + this._token + ";";
22   }
23 }

Luego, se debe de crear un archivo con extensión flex, el cual será el que tendrá las reglas para el
Análisis Léxico.

He comentado el código en las diferentes secciones como para tomar una idea de que es lo que se
realiza en cada una, sin embargo el mejor apoyo es la documentación oficial.

1 /* Sección de declaraciones de JFlex */


2 %%
3 %public
4 %class AnalizadorLexico
5 %{
6  
7  /* Código personalizado */
8  
9  // Se agregó una propiedad para verificar si existen tokens pendiente
10  private boolean _existenTokens = false;
11  
12  public boolean existenTokens(){
13  return this._existenTokens;
14  }
15  
16 %}
17  
18  /* Al utilizar esta instrucción, se le indica a JFlex que devuelva ob
19 %type TokenPersonalizado
20  
21 %init{
22  /* Código que se ejecutará en el constructor de la clase */
23 %init}
24  
25 %eof{
26  
27  /* Código a ejecutar al finalizar el análisis, en este caso cambiaremo
28  this._existenTokens = false;
29  
30 %eof}
31  
32 /* Inicio de Expresiones regulares */
33  
34  Digito = [0-9]
35  Numero = {Digito} {Digito}*
36  Letra = [A-Za-z]
37  Palabra = {Letra} {Letra}*
38  Simbolo = "*"|"+"|"-"|"/"|"#"
39  Espacio = " "
40  SaltoDeLinea = \n|\r|\r\n
41  
42 /* Finaliza expresiones regulares */
43  
44 %%
45 /* Finaliza la sección de declaraciones de JFlex */
46  
47 /* Inicia sección de reglas */
48  
49 // Cada regla está formada por una {expresión} espacio {código}
50  
51 {Numero} {
52  TokenPersonalizado t = new TokenPersonalizado(yytext(), "NUMERO");
53  this._existenTokens = true;
54  return t;
55 }
56  
57 {Palabra} {
58  TokenPersonalizado t = new TokenPersonalizado(yytext(), "PALABRA");
59  this._existenTokens = true;
60  return t;
61 }
62  
63 {Simbolo} {
64  TokenPersonalizado t = new TokenPersonalizado(yytext(), "SIMBOLO");
65  this._existenTokens = true;
66  return t;
67 }
68  
69 {Espacio} {
70  // Ignorar cuando se ingrese un espacio
71 }
72  
73 {SaltoDeLinea} {
74  TokenPersonalizado t = new TokenPersonalizado("Enter", "NUEVA_LINEA")
75  this._existenTokens = true;
76  return t;
77 }

Por último se creará una clase que tendrá la lógica necesaria para leer el contenido de un archivo y
pasar la información a JFlex para su análisis. El archivo tendrá de nombre PruebaJFlex.

1 import java.io.BufferedReader;
2 import java.io.FileReader;
3  
4 public class PruebaJFlex {
5  
6   public static void main(String[] args) {
7  
8   try{
9  
10   // Asignación del nombre de archivo por defecto que usará la aplicac
11   String archivo = "prueba.txt";
12  
13   // Se trata de leer el archivo y analizarlo en la clase que se ha cr
14   BufferedReader buffer = new BufferedReader(new FileReader(archivo));
15   AnalizadorLexico analizadorJFlex = new AnalizadorLexico(buffer);
16  
17   while(true){
18  
19   // Obtener el token analizado y mostrar su información
20   TokenPersonalizado token = analizadorJFlex.yylex();
21  
22   if (!analizadorJFlex.existenTokens())
23    break;
24  
25   System.out.println(token.toString());
26  }
27  }
28  catch (Exception e){
29    System.out.println(e.toString());
30  }
31  }
32 }

Para probar el desarrollo, es necesario un archivo prueba.txt que tendrá la siguiente información.

1 1777*
2 #*1
3 *#06#
4 a123
5 12345
6 este es un
7 ejemplo
8 de
9 analisis
10 lexico
11 con
12 JFlex

¿Y que pasó con el IDE?


Una de las cosas que me he percatado, es que normalmente se buscan soluciones orientadas a la
herramienta o IDE que se este utilizando. Sin embargo al hacerlo, muchas veces llegamos a ignorar el
proceso que se debe de realizar en caso no se tenga ese IDE disponible.

Para ejemplificarlo de mejor manera, colocaremos todos los archivos que se han creado durante este
ejemplo en una misma carpeta.

En una ventana de comandos se ejecutará lo siguiente, tomando en consideración estar en la misma


carpeta que los fuentes o colocar la ruta completa al momento de referirse al archivo.

1 jflex AnalizadorLexico.flex

Al ejecutarse el comando, JFlex crea el código java necesario para realizar el análisis léxico según las
reglas que se establecieron en el archivo AnalizadorLexico.flex.

Para compilar el código fuente, se utiliza la instrucción javac.

1 javac PruebaJFlex.java

El compilador no mostrará ningún mensaje si la compilación se realiza con éxito.


Para ejecutar el programa se utiliza la instrucción java.

1 java PruebaJFlex

Al ejecutarse, mostrará los diferentes Tokens que ha reconocido del archivo prueba.txt.

Con estos sencillos pasos, se ha logrado mostrar el funcionamiento de un analizador léxico creado con
la herramienta JFlex.

Icono utilizado en la Imagen destacada, “Sports Hand Biceps Icon” gracias a Icons8.
Jonathan Búcaro 26 abril, 2015 Código JFlex

Entrada anterior

Instalación JFlex

Entrada siguiente

No se pudo actualizar la partición reservada del sistema

13 Comentarios

Pingback: Sublime Text 2 – Procesar archivos de JFlex | Jonathan Búcaro

baker1562

21 septiembre, 2016 a las 10:00 am

Este mismo codigo sirve para hacer o efectuar operaciones con su orden especifico, por ejemplo 2+3*5,
donde primero se haga la multiplicacion y luego la suma.

Gracias

 Me gusta

Responder
Antonio

19 febrero, 2017 a las 3:31 am

Genial el artículo y el otro de cómo integrarlo con SublimeText.

Ejemplo sencillo y explicado paso a paso, me ha sido de gran ayuda para empezar.

Muchas gracias,

Antonio B.

 Me gusta

Responder

Jonathan Búcaro

19 febrero, 2017 a las 9:55 am

d(^_^)z

 Me gusta

Responder

uchihaandre94

25 febrero, 2018 a las 8:32 am

Buena Jonhy 👍, No sabia que tenias blog… pero a la próxima te pido los archivos solo pa
descargarlos jajajaja, Saludos 😁
 Le gusta a 1 persona

Responder

Jonathan Búcaro

18 abril, 2018 a las 1:58 pm

Ya le tomé foto al chat de que vas a iniciar un blog de angular!

 Me gusta

Responder

Sebastián

17 septiembre, 2019 a las 10:14 am

Hola que tal, tienes la idea de que muestre solo las vocales del texto que es ingresado en el archivo de
prueba. Saludos

 Me gusta

Responder

andres

14 octubre, 2019 a las 9:04 pm


Todos los archivos de este ejemplo se guardan como ,flex me salen error al compilar la pruebaJFLEX

 Me gusta

Responder

Jonathan Búcaro

17 octubre, 2019 a las 4:41 pm

Que tal Andres, puedes compartir los errores que te están generando, así tu comentario es más
constructivo y específico. Hasta el momento no habían reportado inconvenientes 😉
 Me gusta

Responder

Armando

23 noviembre, 2020 a las 11:25 pm

Buena noche, he intentado todo y no logro solucionar estos probelmas:


C:\jflex\Ejercicio>javac PruebaJFlex.java

PruebaJFlex.java:8: error: cannot find symbol

AnalizadorLexico analizadorJFlex = new AnalizadorLexico(buffer);

symbol: class AnalizadorLexico

location: class PruebaJFlex

PruebaJFlex.java:8: error: cannot find symbol

AnalizadorLexico analizadorJFlex = new AnalizadorLexico(buffer);

symbol: class AnalizadorLexico

location: class PruebaJFlex

PruebaJFlex.java:11: error: cannot find symbol

TokenPersonalizado token = analizadorJFlex.yylex();

symbol: class TokenPersonalizado

location: class PruebaJFlex

3 errors

 Me gusta

Responder

Jonathan Búcaro

24 noviembre, 2020 a las 11:14 am

Hola, el ejemplo se realizó asumiendo que todos los archivos se encuentran en la misma carpeta o
que pertenecen al mismo paquete. Podrías revisar si se creó el archivo AnalizadorLexico.java al
ejecutar la instrucción jflex AnalizadorLexico.flex, adicionalmente que este se encuentre en la
misma carpeta que PruebaJFlex.java

 Me gusta

Responder

Armando

24 noviembre, 2020 a las 8:19 pm


si se creo el .java, el problema viene cuando quiero correr el javac PruebaJFlex.java ya que es
donde arroja el error. dude si tenia mal las variables de entorno pero lo hic tal cual lo mencionas.
gracias por tu respuesta

 Me gusta

Jonathan Búcaro

24 noviembre, 2020 a las 9:57 pm

Si, parece que no logra hacer esa referencia al fuente, en el ejemplo todos los archivos están en
la misma carpeta y no pertenecen a algún namespace o paquete declarado explicitamente,
debido a esta razón es que logra encontrarlo y compilar

 Me gusta

Deja un comentario
Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comentario *

Nombre * Correo electrónico *

Web
Publicar el comentario

Notificarme los nuevos comentarios por correo electrónico.

Recibir nuevas entradas por email.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Buscar … Buscar

Etiquetas
C#
Electrónica
JFlex
Logro
aplicaciones
desbloqueado
pfSense
Python
SQL
SQL Server
Windows 10

Visual Studio
VS Code
WSL
Windows Forms

Categorías
.NET (2)
Código (2)
General (13)
Personal (7)
Python (2)

Inicio
Blog
Libros que he leído
Mi lista imposible

También podría gustarte