Analizador Léxico

Hola amigos, este es mi primer post, así que si algo está mal, le agradecería me lo hicieran saber; paso a contarles mi problema: lo que pasa es que he hecho un programa en Java (recién lo estoy aprendiendo) que consiste en un analizador léxico (con mi propio lenguaje) y la clase me ejecuta bien pero cuando ejecuto el programa (o sea, la tazita de café XD) me sale varias líneas en rojo (errores) y no sé cómo solucionarlo, así que pido de su apoyo par apoder ayudarme.

Muchas gracias.

Les dejó el código, para ver si encuentran algún error que yo no encontré.

package dosprueba1;

/**
@author: Irbin
@nick: veneed
@date: 2012-04-21 at 1:01p.m.
Programa de analizador léxico que evalua 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 inicio 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 dígito
                            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 Dígito
                        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 números
                                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 dígito 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 dígito
                    }
                }//end while
            }catch(IOException e){}
        }catch(FileNotFoundException e){}
    }
 
    /**
    Método 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 true;
        else if(c==']') return true;
        else if(c=='.') return true;
        else if(c==':') return true;
        else if(c==',') return true;
        else if(c=='"') return true;
        else if(c=='@') return true; //comentarios
        else if(c=='<') return false;
        else if(c=='>') return false;
        else if(c=='#') return false; // y logico
        else if(c=='°') return false; // o logico
        else if(c=='~') return false; // no logico
        else if(c=='$') return false; // asignacion
        else if(c=='+') return false;
        else if(c=='-') return false;
        else if(c=='*') return false;
        else if(c=='/') return false;
        else if(c=='%') return false; // mod
        else return false;
    }
 
    /**
    retornamos nuestro caracter de operador
    */

    public static char evaluarOperador(char c){
        char car=' ';
        if(c=='<')car='<';
        else if(c=='>')car='>';
        else if(c=='#')car='#';
        else if(c=='°')car='°';
        else if(c=='~')car='~';
        else if(c=='$')car='$';
        else if(c=='+')car='+';
        else if(c=='-')car='-';
        else if(c=='*')car='*';
        else 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=')';
        else if(c=='[')car='[';
        else if(c==']')car=']';
        else if(c=='"')car='"';
        else if(c=='.')car='.';
        else if(c==':')car=':';
        else if(c==',')car=',';
        else if(c=='@')car='@';
       
        return car;
    }
 
    /**
    buscamos si existe la palabra reservada
    */

    public static boolean palabraReservada(String cad){
        if(cad.equalsIgnoreCase("FUNCION")) return true;
        else if(cad.equalsIgnoreCase("SI"))return true;
        else if(cad.equalsIgnoreCase("ENTONCES"))return true;
        else if(cad.equalsIgnoreCase("SINO"))return true;
        else if(cad.equalsIgnoreCase("REPETIR"))return true;
        else if(cad.equalsIgnoreCase("LEER")) return true;
        else if(cad.equalsIgnoreCase("ESCRIBIR")) return true;
        //con equalsIgnoreCase no nos importa si está en mayúsculas o minúsculas o alternadas
        else return false;
    }
 
    public static void main(String ar[]){
        new dosPrueba1("entrada_prueba_3.txt");
        //este será nuestro archivo de entrada
    }
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Las lineas esas en rojo,

Las lineas esas en rojo, cuando le pones el mouse encima tienen un mensaje. Ese mensaje las primeras veces no parece tener sentido pero conforme te vas familiarizando con el compilador van siendo cada vez más útiles.

También debe de haber una pantalla con la salida de esos errores, listalos acá ( incluye un screenshot o algo ) y te podemos ayudar.

Saludos.

Imagen de rodrigo salado anaya

Consejos...

Hola bOhR19, quisiera hacerte unas observaciones:
1: Por convención debes poner con mayúscula la primera letra de tu clase (Capital), pero eso ayuda a que puedas identificar las clases en el código fácilmente; entre otras cosas claro. Te acostumbraras pronto.

2: Trata de no meter todo el código en el constructor (public dosPrueba1(String f)), intenta separarlo como lo hiciste con los otros métodos.

3: Java tiene Listas y las listas tienen métodos que te ayudan mucho, por ejemplo si yo quisiera hacer un método que me dijera si un carácter es separador o no lo aria de la siguiente manera:

package Analizador;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Lex {

    private List<Character> SEPARATORS =  new ArrayList<Character>();

    public Lex(){
        setSeparator();
    }
    private void setSeparator(){
        Collections.addAll(SEPARATORS, ')', '(', '[', ']', '.', ':');
    }

    private boolean isSeparator(char token){
        return SEPARATORS.contains(token);
    }
}

4: En Java 7.x, puedes usar switch con strings, podrías usar eso en tu método palabraReservada. (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/String...)

Bueno no es todo pero por el momento si te parece bien podemos debatir los cambios que te propongo, espero tu opinión. Y si tienes dudas de lo que te digo, por favor dime y si de plano no me la sé yo seguro alguien nos dará un par de consejos.