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]

entiendo todo hasta lo de los Tokens y y eso de StringTokenizer (hay ajam)… pero lo ke no entiendo es ¿què es:
una botella de tequila,
tres bolsas de “Totis” y
música de antro?
hola muy bueno todo pero no puedo compilarlo :-S COMO LE HAGO lo corro desde el cmd con el java1.6.0_07 me marca este error
NOTE: dosPrueba1.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details
que hago???? te lo agradecere amigo
Intenta ejecutarlo desde jGrasp (que es donde lo hice) que no pesa mucho, o desde eclipse o neetbeans y si continúa el error me contactas a mi correo enviándome captura de pantalla. Saludos y suerte 🙂
compilalo en eclipse, yo lo hice y me ejecutó bien, estoy en modificaciones, muy buen aporte!! 🙂 *****
oye donde aparece el archivo creado el de prueba y ya con el contador de caracteres???
Aparece en consola o podrías mandarlo a imprimir en un archivo de salida agregando la línea faltante después de DataInputStream in… y en lugar de escribir System.out.println(…
escribir out.println(…
espero te sea de ayuda 🙂
oye le puse de esta forma no se si este bien me podrias orientar si no es mucha molestia
FileWriter fichero = null;
PrintWriter pw = null;
try
{
fichero = new FileWriter(«c:/software.txt»);
pw = new PrintWriter(fichero);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Nuevamente aprovechamos el finally para
// asegurarnos que se cierra el fichero.
if (null != fichero)
fichero.close();
} catch (Exception e2) {
e2.printStackTrace();
}
Después de la línea que dice:
try{
DataInputStream in=…
escribe esto:
PrintStream out=new PrintStream(new FileOutputStream(«nombre_archivo_salida.txt»));
y después en todo el código donde veas un System.out.println sustituir por:
out.println
espero se entienda y cualquier cosa me avisas.
ayuda por favor que no encuetro el archivo???
Debe de aparecerte donde tengas guardado tu archivo y se genera automáticamente y si no mejor ve la ejecución en consola, y quizá no funcione por que tu archivo de entrada debe de llamarse:
entrada_prueba_3.txt
y ahí colocar algo como:
«if(x==5)
luigi.puraslineas
if(10<y);"
alo de mas si le entiendo pero mi pregunta es a donde se guarda el archivo de prueba ala unidad c: o a alguna carpeta en especifico
?????
depende de donde lo estés compilando, si es en eclipse se guarda en la carpeta del workspace// c// «y el nombre del proyecto que creaste»
espero te sea de ayuda 🙂
oye mejor te dejo mi correo para tener una charla mas estable para entendernos mejor como vez…. si necesito que me orientes soy novato para esto =)
k_a_dete@hotmail.com
en el correo las separaciones son guion bajo
buen aporte GianBros, solo necesito hacer mis propias modificaciones… para que en los operadores pueda dar un tipo en especifico, te recomedaría usar un swich, para que cada caracter sea especificado en distinto tipo…. 🙂
de nuevo, buen aporte!!!
Muchas gracias por la idea del switch si lo tomare en cuenta, gracias por los comentarios Tomas 🙂
Saludos.
amigo tengo la tarea de hacer un analizador léxico, pero entre los requerimientos me pide que utilice espacios en lugar de tokens, y la razón es, segun él, que cuando tenga que hacer los otros dos analizadores (para un compilador) los tokens seran solo un problema.
mi duda radica en, qué diferencia hay en los codigos entre tokens y espacios?
agradezco la ayuda que me puedan proporcionar.
Muchas gracias WeskerGCN por tu comentario respecto a lo que preguntas; el programa que comparto va evaluando carácter por carácter y concatenando según tenga letras, dígitos o algún otro carácter, a lo que me imagino tu profesor te esta pidiendo es que lo realices con espacios en lugar de tokens (en este programa no ocupo ninguno de los dos)
pero la diferencia radica en que en os tokens puedes especificar un conjunto de caracteres pero separar las líneas en este caso operadores de separación y operadores aritméticos realmente un rollo, y si conforme crece el programa se vuelve más complejo, entonces para mayor comodidad y fácil entendimiento puedes emplear los espacios que me imagino tu profesor hace referencia a la función split, esta te almacena en un arreglo de cadenas cada palabra; por ejemplo si tuvieras: cad=»puras lineas punto com la weblog de quien sabe que cosa 2.0″;
la función split sería algo así:
String arrCad[]=cad.split(» «); //espacio en blanco
for (int i=0;i