analizador léxico _ java méxico

7
23/6/2014 Analizador Léxico | Java México http://www.javamexico.org/foros/comunidad/analizador_lexico 1/7 ... (http://sg.com.mx/sgce) Analizador Léxico 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 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 (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 {

Upload: oscar-hernandez

Post on 23-Nov-2015

45 views

Category:

Documents


1 download

TRANSCRIPT

  • 23/6/2014 Analizador Lxico | Java Mxico

    http://www.javamexico.org/foros/comunidad/analizador_lexico 1/7

    ...

    (http://sg.com.mx/sgce)

    Analizador LxicoSubmitted 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

  • 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; // 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='%';

    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)

    SEPARATORS = new ArrayList

    (http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/ArrayList.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.