11 de mayo de 2010

Autómata hecho en Java – Constantes numéricas

En respuesta a al primer articulo de un autómata que hice y que publique aquí, ahora he realizado otro exclusivamente para la comunidad de programadores novatos como yo.

Solo que en esta ocasión lo he perfeccionado en muchos aspectos con respecto al antes mencionado.

Ahora tratare de explicar el código que pongo a continuación para su descarga e ir siguiendo la pequeña explicación que expongo. Además la mayoría del código va muy bien explicado. Pero si tienes alguna duda, puedes mandarme un correo a vscorpion.black@gmail.com y te lo responderé con mucho gusto.

Bien, antes que nada, necesitas descargar el código y el archivo de ejemplo que vienen comprimidos en el archivo Automata.zip. Son 2 archivo, uno de nombre Automata.java (Código fuente) y Cadenas.txt (archivo para analizar) el cual debemos tener en el mismo directorio que nuestro archivo fuente. Después procederemos a compilar nuestro archivo fuente, para lo cual si tu gusta puedes ayudar en algún IDE que soporte Java como BlueJ, Jcreator, NetBeans, Eclipse, etc.

Y lo ejecutamos para ver el resultado.

Si todo va bien, comencemos a analizar el código
Por cierto, aqui esta el automata y la matriz de forma grafica para que te puedas ubicar mas facilmente.



Para empezar, debemos mencionar que tenemos 2 clases dentro del archivo fuente; la clase Autómata y la clase Analizador. La primera es public, por lo cual ahí metemos nuestro método principal main para comenzar el análisis Y también ahí es donde creamos un objeto con referencia a nuestra clase Analizador, el cual nos servirá para mandar llamar los métodos necesarios para el análisis

Dentro de nuestro método main, tenemos varias referencias a métodos y objetos para comenzar a leer nuestro archivo Cadenas.txt

Primero declaramos una variable de tipo String donde estaremos almacenando los datos del archivo para posteriormente mandar analizarla.

A continuación realizamos la lectura del archivo, y comenzaremos a almacenar en nuestra variable, linea por linea lo que tengamos en el archivo para mandarlo analizar. Nos fijamos que encerramos esa parte del código en un try para atrapar la exception en caso de que no se encuentre el archivo Cadenas.txt y antes de que finalice mandamos a imprimir el resultado mediante una llamada al método imprimirResultado de la clase Analizador, el cual mandamos referenciar mediante el objeto que hemos creado.

Ahora seguimos con nuestra siguiente clase, la cual contiene los métodos necesarios para poder realizar el análisis y mostrar el resultado del mismo.

Lo primero que vemos en esta clase, son la declaración de variables a objetos que vamos a utilizar como cadenas, vectores, enteros y una matriz de tipo entero.

En el código vienen las declaraciones así como una pequeña reseña para saber cual es su utilidad dentro del programa.

En esta clase utilizaremos 8 métodos, los cuales son: 

public void analizar(String linea)
private void comprobar(String palabra)
private int buscar(char caracter)
private void almacenarValor(char c)
private void almacenarValor(String s)
private void guardarCadenas()
private void guardarCadenas(String temp1, String temp2)
public void imprimirResultado()

A continuación se describirá cada uno de estos métodos

- public void analizar(String linea)

Este método es utilizado durante la lectura del archivo de texto dentro del método main. Y recibe linea por linea según las lineas que tenga nuestro archivo que se va a analizar.

Dentro la función de este método es recibir las lineas de texto y separar cada cadena, esto quiere decir, obtener cadenas sin espacios para posteriormente mandar analizar esa pequeña cadena. Y cuando esta finalice, se manda llamar la siguiente y la siguiente hasta que la linea ya no tenga mas cadenas. Entonces recibe una nueva linea del archivo de texto.

Cuando tiene cada cadena, la manda al método comprobar() que describiremos a continuación

- private void comprobar(String palabra)

Este método recibe una cadena y la comienza a analizar para determinar que tipo de constante numérica es. Realizando el análisis mediante nuestra matriz de transicin obtenida del análisis de nuestro autómata

Va comparando el estado que se va obteniendo para determinar que no sea un error. Y en caso de que así sea, almacena toda esa cadena en una variable y la guarda en una pila con su respectiva comparación Y comienza a analizar una nueva cadena del método analizar() previamente visto aquí

Y si no se consiguió un estado de error, se pregunta si se alcanzo el final de la cadena que se esta analizando para verificar el ultimo estado obtenido y determinar que tipo de constante o en caso de que la cadena hubiera terminado de forma incompleta, pues termina en otro error y es aquí también donde se determina para posteriormente almacenar el resultado de la cadena que se hubiera estado analizando.

- private int buscar(char caracter)

Gracias a este método obtenemos la posición de la columna correspondiente para nuestra matriz de transiciones.

Recibe un caracter y en base en el, se determina si este es un dígito, un punto, una e o E o en dado caso un símbolo invalido, el cual nos regresara la posición de la matriz y además procedemos a almacenar el caracter obtenido en la variable mediante el método almacenarValor() para después almacenarla completa con su correspondiente descripción del resultado.

- private void almacenarValor(char c)

Este método recibe un caracter y lo amacena en una variable temporal.

- private void almacenarValor(String s)

Este método recibe toda una cadena de caracteres y la almacena en una variable temporal.

- private void guardarCadenas()

Con este método, guardamos cadena por cadena con su respectiva descripción en una pila para después obtener esos valores e imprimirlos.

- private void guardarCadenas(String temp1, String temp2)

Este metodo al igual que el anterior lo utilizamos para almacenar el resultado del análisis Solo que este lo utilizaremos para guardar los valores cuando se produzca un error.

- public void imprimirResultado()

Con este método imprimiremos el resultado del análisis en la pantalla.

Lo que hacemos es obtener los valores que guardamos en el vector, y comenzar a imprimirlos usando el System.out.println();

Y pues eso es todo básicamente el procedimiento, los métodos y las variables necesarias para realizar el análisis mediante un autómata de las constantes numéricas

Revisalo bien, ejecutalo varias veces y ve revisando el código paso por paso, para que sepas que es lo que se va haciendo. Y de esta manera conseguirás entenderlo mejor para que puedas implementar algún autómata para ti.

Eso es todo, y no me queda mas que decir gracias por su atención, y si te gusto o no, hazmelo saber en un comentario para seguir mejorando. Y si tienes dudas sobre el comportamiento en algún punto especifico, nadamas envíame un correo electrónico

Hasta la próxima

7 pensamientos, más el tuyo!:

Anónimo dijo...

Es una delicia este código, de verdad una delicia

Yo hice un programa, con la misma finalidad de reconocer cadenas, pero sólo con notación cientifica las demás opciones me las debía descartar. Lo hice muy similar al código que tienes sin explicar y realmente tuve que pensar demasiado (algo bueno por cierto) pero no me salía hasta que porfin en un haz de luz llegó la respuesta y lo hice.
No había visto el código explicado pero ahora que lo veo y analizo, wow!! realmente te felicito, durante el proceso de hacer el programa, tenía la misma idea del código explicado pero no sabía como hacerlo.
Felicidades, muy buen código y muy buena explicación.

Victor Alfonso dijo...

Hola.

Muchas gracias por el halago. Me da alegría saber que este código te gusto. Eso me da mas ánimos para seguir publicando cosas de este tipo.

Gracias.

@mane64bits dijo...

Qe tal, muy bien explicado el código, gracias, me ayudó mucho. xD

Anónimo dijo...

Hola, estoy empezando en esto de java apenas y tu código me parece muy interesante, una pregunta, como sabe el programa que va a reconocer solo datos numéricos?, lo que pasa es que yo voy hacer uno pero necesito que me reconozca letras y números y me dija el numero de linea donde estuvo el error.No me queda muy claro la parte donde esta la matriz de transición.
Muchas gracias por tu atención y se me hace una noble actividad esto que haces al compartirnos tus programas para ayudarnos.Gracias!!

Anónimo dijo...

Antes que nada una felicitacion por tu codigo y explicacion que estan muy comprensibles.
Pero me podrias explicar la parte de la matriz de donde salen los valores y para que te sirven.
te dejo mi correo

irma_angelica1991@yahoo.com.mx

saludos y gracias

Juan Carlos C dijo...

Muchas gracias!! me ayudo para mi proyecto final

Anónimo dijo...

Me sirvio mucho brother... Gracias, Sigue Adelante.