Hola que tal amig@s programadores y gente con mucho tiempo libre y que de última hora anda buscando un analizador léxico… :s (espero si hayas llegado acá buscando eso y no por buscar «Red Tube punto com«), pues resulta que en la clase de Traductores del profesor Ing. Armando Díaz Pérez, ya comenzamos a talachearle con la programación y pues lo primero que cruzo por nuestra mente pues «inge su…» lo hacemos con Tokens, bueno para ser más precisos con la función de StringTokenizer, pero el profesor nos aconsejo no utilizarlo ya que después conforme vayamos avanzando se nos dificultará más y más, así que para no meternos en líos hubo que rehacer todo y con una botella de tequila a lado, tres bolsas de «Totis», y pura música de antro para no dormirnos, iniciamos el programa, según yo y mi cerebro que ya está chingando que se quiere ir a dormir el programa ya está bien 🙂
Éste analizador Léxico está programado en Java y reconoce: identificadores (variable), palabras reservadas, números, operadores, separadores, letra y dígito , y se crea con la intención de en un futuro poder desarrollar un compilador, la verdad no estoy del todo seguro que el programa este bien o sea lo que pidió el profesor pero bueno el intento acá está o si quiera que sirva de mal ejemplo.
El código ya va comentado y sólo hace falta agregar sus operadores, separadores, palabras reservadas, y su archivo de entrada debera llamarse: «entrada_prueba_3.txt» (sin las comillas dobles) o cambiar en la línea 118 el nombre establecido por el nombre de su archivo de entrada.
Cualquier duda, aclaración, consejo es bien recibido, saludos cordiales y espero les sirva de algo.
[java]
/**
@author: Luigi Pérez Calzada
@nick: GianBros
@date: 2011-08-11 at 3:39a.m.
Programa de analizador léxico que evlua si existe un numero, un separado
un operador, una palabra, una palabra reservada
*/
import java.io.*;
import java.util.*;
class dosPrueba1{
public dosPrueba1(String f){
String bufferIn;
try{
DataInputStream in=new DataInputStream(new FileInputStream(f));//leemos nuestro archivo de entrada
try{
while((bufferIn=in.readLine())!=null){//mientras no lleguemos al fin del archivo…
int i=0;
String cad=bufferIn.trim();
//eliminamos los espacios en blanco al incio o al final (pero no a la mitad)
while(i<cad.length()){//recorremos la línea
char t=cad.charAt(i);//vamos leyendo caracter por caracter
if(Character.isDigit(t)){//comprobamos si es un digito
String ora="";
ora+=t;
int j=i+1;
while(Character.isDigit(cad.charAt(j))){
//mientras el siguiente elemento sea un numero
ora+=cad.charAt(j);//concatenamos
j++;
if(j==cad.length())break;//rompemos si llegamos al final de la línea
}
i=j;//movemos a nuestra variable i en la cadena
System.out.println("Número–>"+ora);
continue;//pasamos al siguiente elemento
}//end if si es Digito
else if(Character.isLetter(t)){//comprobamos si es una letra
String ora="";
ora+=t;
int j=i+1;
while(Character.isLetterOrDigit(cad.charAt(j))){
//mientras el siguiente elemento sea una letra o un digito
//ya que las variables pueden ser con numeros
ora+=cad.charAt(j);
j++;
if(j==cad.length())break;
}
i=j;
if(palabraReservada(ora)){//comprobamos si es una palabra reservada
System.out.println("Palabra reservada="+ora);
}
else{//caso contrario es un identificador o variable
System.out.println("Identificador–>"+ora);
}
continue;
}//end if si es variable
else if(!Character.isLetterOrDigit(t)){
//si no es letra ni digito entonces…
if(evaluarCaracter(t)){//¿es separador?
System.out.println("Separador–>"+evaluarSeparador(t));
}else{//¿o es un operador?
System.out.println("Operador–>"+evaluarOperador(t));
}
i++;
continue;
}//end if si es diferente de letra y digito
}
}//end while
}catch(IOException e){}
}catch(FileNotFoundException e){}
}
/**
Metodo que evalua nuestro caracter si existe y nos retorna
verdadero para los separadores
y
falso para los operadores
*/
public static boolean evaluarCaracter(char c){
if(c=='(‘) return true;
else if(c==’)’)return true;
else if(c=='<‘)return false;
else if(c==’>’)return false;
else return false;
}
/**
retornamos nuestro caracter de operador
*/
public static char evaluarOperador(char c){
char car=’ ‘;
if(c=='<‘)car='<‘;
else if(c==’>’)car=’>’;
return car;
}
/**
retornamos nuestro caracter de separador
*/
public static char evaluarSeparador(char c){
char car=’ ‘;
if(c=='(‘) car='(‘;
else if(c==’)’)car=’)’;
return car;
}
/**
buscamos si existe la palabra reservada
*/
public static boolean palabraReservada(String cad){
if(cad.equalsIgnoreCase("if")) return true;
else if(cad.equalsIgnoreCase("luigi"))return true;
else if(cad.equalsIgnoreCase("puraslineas"))return true;
//con equalsIgnoreCase no nos importa si esta en mayusculas o minusculas o alternadas
else return false;
}
public static void main(String ar[]){
new dosPrueba1("entrada_prueba_3.txt");
//este será nuestro archivo de entrada
}
}
[/java]

hola que tal. disculpa la ignorancia. soy nuevo en esto, alguien me puede decir como crear el archivo “entrada_prueba_3.txt” y como declaro las palabras reservadas aquí? ayúdenme porfas..
Hola Tony ya puse a disposición el código de «entrada_prueba_3.txt» y descuida a todos nos ha pasado, mira si trabajas sobre Windows abres la carpeta donde desees crear el txt, das clic derecho sobre alguna parte vacía (en blanco) seleccionas la opción que dice «Nuevo» y te abre más opciones de ahí das clic en «Archivo de Texto» y automáticamente te creara un archivo con la extensión «txt», espero te sirva saludos 🙂
Hola, gracias amigo por el analizador.
Hola Vash muchas gracias por tomarte el tiempo para agradecer, y claro espero se de ayuda u orientación éste código.
HOla amigo con una consulta fijate que a mi me dejaron un proyecto similar el cual debe llevar ademas de variables, sus reglas y terminales, me podrias dar alguna idea sobre como obtener estos datos. gracias.
Hola J-zap podrías explicarme como que sus reglas y terminales? algún ejemplo? es que no comprendí del todo tu pregunta.
me puedes enviar el bin del compilador en java para editarlo a y por favor mi que que programa o version de java utilizaste para hacer el compilador es urgente es para entregar en la universidad como practica .
Pues el bin creo que no es ni necesario ya que estoy compartiendo todo el código fuente puedes modificarlo a tu antojo, versión de java no habría ningún problema ya que no uso algo «complejo», espero te sea de ayuda.
hoal muchas gracias por compartir el el codigo del alizador lexico me preguntaba si no has hecho un vídeo de como comenzaste ha hacer analizador lexico. si lo has hecho publica el para poder seguir los pasos
No, lo siento Juan no he realizado ningún vídeo tutorial ya que como comparto el 100% del código e intento explicarlo lo mayor posible, sería doble trabajo, aunque lo tomaré en cuenta y quizá haga como recomiendas el vídeo de los códigos intento explicarlos… Suena buena idea tendré que analizarlo más a detalle. Gracias.
nose como agregar las palabras reservadas
if(cad.equalsIgnoreCase(«if»)) return true;
en vez del if agrego de una en una o como?
Puedes ver el archivo de ejemplo en http://puraslineas.com/blog/blog/wp-content/uploads/2011/08/entrada_prueba_3.txt Y si deberás agregarla una por una, y si es una nueva deberás agregarla en el código.
hola amigo;nose como crear ni correr el archivo,nose si puedes explicarlo al detalle como crearlo y poner el el codigo??,se te agradece demasiado de antemano
Ok trataré de explicar de la mejor manera como correr un java, suponiendo que tengas ya instalado el jdk (con su variable de entorno) abres la línea de comandos de windows (control+R) y escribes «cmd» (sin las comillas dobles) escribes «java» y te deberá desplegar varias opciones hecho esto tienes instalado el jdk.
Ahora abres el block de notas y copias y pegas el código fuente lo guardas con el nombre dosPrueba1.java y creas un archivo txt con el contenido del archivo de lectura los guardas en la misma carpeta y en la línea de comandos te diriges hacia donde guardaste tus archivos y ya en el directorio escribes:
javac dosPrueba1.java
y luego para ejecutar javadosPrueba1
Espero te sirva, saludos 🙂
Q tal hermano, pues tengo una duda, como podria yo hacer que el codigo cree otro archivo. por ejemplo “entrada_prueba_3.txt” lo lee y este mismo codigo cree otro archivo pero con los resultados que muestra en la pantalla. Mi idea es crear un simulador de compilador para un microprocesador. No se si este codigo me sirva.
Se que te sacaras de onda con mi comentario, pero soy novato en esto, y cuando estas desesperado recurres a cualquier cosa.
saludos!!
q tal amigo, mi duda es como hacer que el codigo cree otro archivo nuevo, con los datos que se muestra en la pantalla esten guardadas en ese archivo
Ademas de que si este codigo me serviria para un simulador de compilador?? soy nuevo en esto
saludos
Hola Roy claro que se puede adaptar a un compilador, solo es cuestión de que utilices tu imaginación. Saludos :=)
Hola GianBros!
Gracias por compartir el código!
Al momento de compilarlo por consola me muestra esto:
«Note: dosPrueba1.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.»
Sabes de que manera lo podría solucionar?
Te agradecería muchísimo, ya que debo realizar un simulador de compilador de asignación, con las características que mencionas «Que separe en tokens y reconozca: identificadores (variable), palabras reservadas, constantes, operadores, separadores, letra y dígito»…y aparte haga el árbol sintáctico, =( estoy un poco abrumada, pues poco se de programación y es un proyecto para mi clase de Ciencias de la computación.
Mil gracias