Analizador Léxico

6
Analizador Léxico Publicado por GianBros un Jueves, agosto 11th 2011 11 ago 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. /** @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.*;

description

lenguajes y automatas 1

Transcript of Analizador Léxico

Page 1: Analizador Léxico

Analizador LéxicoPublicado por GianBros un Jueves, agosto 11th 2011   

11ago

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.

/**

@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;

Page 2: Analizador Léxico

        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))){

Page 3: Analizador Léxico

                            //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){}

Page 4: Analizador Léxico

    }

    /**    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=')';

Page 5: Analizador Léxico

        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

    }

}