Analizador Léxico

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]