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]

Muy bueno tu analizador Léxico, gracias…..Oie me puedes ayudar en el Sintáctico,apenas comienzo en el mundo de la programación en Java esta genial, bueno día….
Claro yo te ayudo y oriento no te preocupes pero ¿qué debe hacer tu analizador Sintáctico?, saludos 🙂
Muchas gracias, tu analizador léxico está perfecto! con perfecto me refiero que funciona a la perfección, sólo hace falta agregar los operadores, palabras reservadas, etc.
Excelente página, saludos.
Gracias por la informacion,espero que me sirva para hacer parte de mi tarea
hola quisiera si me pudieras ayudar a tu programa que publicaste me dijeras como puedo imprimir la linea donde se encuentra cada uno de los identificadores, operadores y reservadas gracias ojala puedas responderme pronto
Después de estás líneas de código:
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…
//pondrías:
System.out.println(in.readLine());
//y con ello ya estás imprimiendo lo que pides del archivo de texto de entrada, o el otro que medio entendí es que en el método de «palabraReservada» después de cada comparación de if donde dice «return true» podrías en lugar de eso o ahí mismo poner un System.out.println([nombre_identificador]);
Si ninguna de estas es la solución me podrías explicar bien que es lo que quieres hacer exactamente? saludos cordiales y hasta pronto.
Hola tu programa funciona perfectamente…Solo queria saber como puedo hacer para inprimir los caractere o palabras en un JtextArea y no se borren ya estuve intentandole y no he podido… o que tengo que modificar…Agradeceria mucho tu respuesta
Interesante el código, lo tendré que «migrar» a VB .NET jaja xD para un proyecto que comense ah hacer , que es algo asi como «Basic para la Web: contonua programando en Basic pero ahora para la web, backend y frontend» jaja xD que opinas?
como te quedo en vb necesito uno
Hola, oigan esta bueno el código, pero porque no me corre…
ayudenme porfa
¿Qué error te marca?
Y si estás llamando de la misma manera a tu archivo de entrada? y en los catchs agrega la impresión del error para ver donde truena tu programa quizá sea eso, «System.out.println(e);»
Saludos 🙂
Gracias por este programa, me porias explicar como correrlo en netbeans 7.2, por favor.
Para correrlo en NetBeans necesitas crear tu proyecto, y llama a tu clase principal «dosPrueba1» (sin las comillas dobles) y crear tu txt “entrada_prueba_3.txt” (sin las comillas dobles) que estará (no recuerdo bien) prueba a dentro de la carpeta raíz del proyecto y si no dentro de la carpeta src, o afuera de esta, saludos cordiales :)y espero te sea útil.
como genero mi archiv de entrada es que yo de verdad no se nada de java y no entiendo bien
esta bueno tu programa pero me marca error aqui:}
public static boolean evaluarCaracter(char c){
public static char evaluarOperador(char c){
public static char evaluarSeparador(char c){
aque se debe?
¿En que lo estás corriendo?
Todo mi código lo tienes en una sola clase?
Y que error te marca exactamente?
Para saber cual podría ser la causa.
Saludos 🙂