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é.
/**
@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
}
}
- Inicie sesión o regístrese para enviar comentarios
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.
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:
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.