Sunteți pe pagina 1din 7

23/6/2014 Analizador Lxico | Java Mxico

http://www.javamexico.org/foros/comunidad/analizador_lexico 1/7
...
(http://sg.com.mx/sgce)
Analizador Lxico
Submitted by bOhR19 (/usuarios/bohr19) on Mar, 04/24/2012 - 10:06
Hola amigos, este es mi primer post, as que si algo est mal, le agradecera me lo
hicieran saber; paso a contarles mi problema: lo que pasa es que he hecho un
programa en Java (recin lo estoy aprendiendo) que consiste en un analizador lxico
(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 lneas en rojo (errores) y no s cmo
solucionarlo, as que pido de su apoyo par apoder ayudarme.
Muchas gracias.
Les dej el cdigo, para ver si encuentran algn error que yo no encontr.
package dosprueba1;
/**
@author: Irbin
@nick: veneed
@date: 2012-04-21 at 1:01p.m.
Programa de analizador lxico 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
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) f){
String (http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html)
bufferIn;
try{
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 2/7
DataInputStream (http://www.google.com/search?
sitesearch=java.sun.com&q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+DataInputStream)
in=new DataInputStream (http://www.google.com/search?
sitesearch=java.sun.com&q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+DataInputStream) (new
FileInputStream
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/io/FileInputStream.html)
(f));//leemos nuestro archivo de entrada
try{
while((bufferIn=in.readLine())!=null){//mientras no
lleguemos al fin del archivo...
int i=0;
String
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html)
cad=bufferIn.trim();
//eliminamos los espacios en blanco al inicio o
al final (pero no a la mitad)
while(i<cad.length()){//recorremos la lnea
char t=cad.charAt(i);//vamos leyendo
caracter por caracter
if(Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html) .isDigit(t))
{//comprobamos si es un dgito
String
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) ora="";
ora+=t;
int j=i+1;
while(Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html)
.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 lnea
}
i=j;//movemos a nuestra variable i en la
cadena
System
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html)
.out.println("Nmero-->"+ora);
continue;//pasamos al siguiente elemento
}//end if si es Dgito
else if(Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html)
.isLetter(t)){//comprobamos si es una letra
String
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) ora="";
ora+=t;
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 3/7
int j=i+1;
while(Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html)
.isLetterOrDigit(cad.charAt(j))){
//mientras el siguiente elemento sea una
letra o un digito
//ya que las variables pueden ser con
nmeros
ora+=cad.charAt(j);
j++;
if(j==cad.length())break;
}
i=j;
if(palabraReservada(ora)){//comprobamos
si es una palabra reservada
System
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html)
.out.println("Palabra reservada="+ora);
}
else{//caso contrario es un
identificador o variable
System
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html)
.out.println("Identificador-->"+ora);
}
continue;
}//end if si es variable
else if(!Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html)
.isLetterOrDigit(t)){
//si no es letra ni dgito entonces...
if(evaluarCaracter(t)){//es separador?
System
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html)
.out.println("Separador-->"+evaluarSeparador(t));
}else{//o es un operador?
System
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/System.html)
.out.println("Operador-->"+evaluarOperador(t));
}
i++;
continue;
}//end if si es diferente de letra y dgito
}
}//end while
}catch(IOException
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/io/IOException.html) e){}
}catch(FileNotFoundException
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/io/FileNotFoundException.html) e){}
}
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 4/7

/**
Mtodo 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;
}
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 5/7

/**
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
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) 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 maysculas
o minsculas o alternadas
else return false;
}

public static void main(String
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) ar[]){
new dosPrueba1("entrada_prueba_3.txt");
//este ser nuestro archivo de entrada
}
}
Opciones de visualizacin de comentarios
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 6/7
(/usuarios/oscarryz)
(/usuarios/rodrigo_salado_anaya)
Lista plana: expandida Fecha: primero los ms antiguos
50 comentarios por pgina Guardar las opciones
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,
(/foros/comunidad/analizador_lexico#comment-20041)
Submitted by OscarRyz (/usuarios/oscarryz) on Jue, 04/26/2012 - 08:43.
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 ms tiles.
Tambin debe de haber una pantalla con la salida de esos errores, listalos ac (
incluye un screenshot o algo ) y te podemos ayudar.
Saludos.
Consejos...
(/foros/comunidad/analizador_lexico#comment-20045)
Submitted by rodrigo salado anaya (/usuarios/rodrigo_salado_anaya) on Jue, 04/26/2012 - 11:32.
Hola bOhR19, quisiera hacerte unas observaciones:
1: Por convencin debes poner con mayscula la primera letra de tu clase
(Capital), pero eso ayuda a que puedas identificar las clases en el cdigo
fcilmente; entre otras cosas claro. Te acostumbraras pronto.
2: Trata de no meter todo el cdigo en el constructor (public
dosPrueba1(String
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/String.html) f)),
intenta separarlo como lo hiciste con los otros mtodos.
3: Java tiene Listas y las listas tienen mtodos que te ayudan mucho, por ejemplo
si yo quisiera hacer un mtodo que me dijera si un carcter es separador o no lo
aria de la siguiente manera:
23/6/2014 Analizador Lxico | Java Mxico
http://www.javamexico.org/foros/comunidad/analizador_lexico 7/7
package Analizador;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Lex {
private List (http://www.google.com/search?
sitesearch=java.sun.com&q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+List) <Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html) >
SEPARATORS = new ArrayList
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/ArrayList.html) <Character
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/Character.html) >();
public Lex(){
setSeparator();
}
private void setSeparator(){
Collections
(http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/Collections.html)
.addAll(SEPARATORS, ')', '(', '[', ']', '.', ':');
}
private boolean isSeparator(char token){
return SEPARATORS.contains(token);
}
}
4: En Java 7.x, puedes usar switch con strings, podras usar eso en tu mtodo
palabraReservada.
(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/String...
(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/StringSwitchDemo.java) )
Bueno no es todo pero por el momento si te parece bien podemos debatir los
cambios que te propongo, espero tu opinin. 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.

S-ar putea să vă placă și