14
COMPILADORES Analizador Léxico en Java. Elizabeth Giles Hernández Semestre 6º. Chilpancingo, Gro. 12 de Julio del 2013 Universidad Autónoma de Guerrero. Unidad Académica de Ingeniería.

153325509-Analizador-lexico

Embed Size (px)

Citation preview

  • COMPILADORES Analizador Lxico en Java.

    Elizabeth Giles Hernndez Semestre 6.

    Chilpancingo, Gro. 12 de Julio del 2013

    Universidad Autnoma de Guerrero.

    Unidad Acadmica de Ingeniera.

  • Analizador lxico.

    Un analizador lxico o analizador lexicogrfico (en ingls scanner) es la primera fase de un

    compilador consistente en un programa que recibe como entrada el cdigo fuente de otro programa

    (secuencia de caracteres) y produce una salida compuesta de tokens (componentes lxicos) o

    smbolos. Estos tokens sirven para una posterior etapa del proceso de traduccin, siendo la entrada

    para el analizador sintctico (en ingls parser).

    Pasos para crear un analizador lxico en JAVA.

    1. Se descarga el Jflex desde la pgina http://jflex.de/download.html y se descomprime en la

    unidad C:

    2. Se crea una librera en Netbeans, para ello nos vamos a Tools, seleccionamos Ant Libraries.

  • 3. Le damos clic en el botn New Library y le asignamos un nombre a nuestra librera, en este

    caso se llama JFlex. Posteriormente aadimos la ruta donde se encuentra el archivo

    JFlex.jar, picando en el botn Add JAR/Folder..., en este caso el archivo se encuentra en la

    ruta C:\jflex-1.4.3\jflex-1.4.3\lib y presionamos OK.

  • 4.- Creamos nuestro proyecto, seleccionamos Java Application y le damos en Next, le

    asignamos el nombre jflexnetbeans y nombramos la clase principal como main.

  • 5.- Posteriormente creamos un archivo vacio (empty file) el cual nombraremos como

    Lexer y le asignaremos la extensin .flex, a este archivo le indicaremos las reglas lxicas

    para nuestras expresiones

  • 6.- A continuacin crearemos una clase numerada, que llamaremos Token en la cual

    contendr los tokens a utilizar en nuestra aplicacin.

  • 7.- Importamos nuestra librera JFlex, para poder crear un archivo Lexer.java el cual nos

    ejecutara nuestro analizador lxico. Posteriormente en nuestro archivo main definimos la

    variable de entorno path para generar nuestro analizador lxico, el cual se generar al

    ejecutar la clase main.

  • 8.- Creamos nuestra interfaz con un archivo JFrame, el cual nombraremos como Interfaz.

  • 9.- Diseamos nuestra interfaz, empleando dos etiquetas (label), un botn (Button), una caja de

    texto (Text Field) y un rea de texto (Text Area).

    10.- Posteriormente creamos una clase pblica que nos permitir ejecutar el analizador lxico y

    que nos mostrar el resultado. En este caso, el cdigo crea un archivo .txt al introducir los

    caracteres en el campo de texto, guarda el contenido y se ejecuta un reader el cual nos

    determinar si es un nmero entero, un signo o una cadena caracteres en el rea de texto.

  • 11.- Al botn Analizar se le pondr el siguiente cdigo, el cual ejecutar una accin para que se

    inicialice el analizador lxico y en caso de error imprima un mensaje.

    12.- Finalmente, ejecutamos nuestra interfaz, ingresamos el texto o carcter y analizamos.

  • Cdigo.

    Main.java

    public class Main {

    /**

    * @param args the command line arguments

    */

    public static void main(String[] args) {

    String path =

    "C:/Users/Elizabeth/Documents/NetBeansProjects/JFlexNetbeans/src/jflexnetbeans/Lexer.flex";

    generarLexer(path);

    }

    public static void generarLexer(String path){

    File file=new File(path);

    JFlex.Main.generate(file);

    }

    Lexer.flex

    package jflexnetbeans;

    import static jflexnetbeans.Token.*;

    %%

    %class Lexer

    %type Token

    L = [a-zA-Z_]

    D = [0-9]

    WHITE=[ \t\r\n]

    %{

    public String lexeme;

  • %}

    %%

    {WHITE} {/*Ignore*/}

    "=" {return ASIGNACION;}

    "+" {return SUMA;}

    "*" {return MULTIPLICACION;}

    "-" {return RESTA;}

    "/" {return DIVISION;}

    {L}({L}|{D})* {lexeme=yytext(); return CARACTER;}

    ("(-"{D}+")")|{D}+ {lexeme=yytext(); return ENTERO;}

    . {return ERROR;}

    Token.

    package jflexnetbeans;

    /**

    *

    * @author Elizabeth

    */

    public enum Token {

    CARACTER, ENTERO, SUMA, RESTA, DIVISION, MULTIPLICACION, ASIGNACION, ERROR

    }

  • Clase pblica probarLexerFile.

    public void probarLexerFile()throws IOException{

    File fichero = new File ("fichero.txt");

    PrintWriter writer;

    try {

    writer = new PrintWriter (fichero);

    writer.printf(jTextField1.getText());

    writer.close();

    } catch (FileNotFoundException ex){

    Logger.getLogger(Interfaz.class.getName()).log(Level.SEVERE,null, ex);

    }

    Reader reader = new BufferedReader (new FileReader ("fichero.txt"));

    Lexer lexer = new Lexer (reader);

    String resultado= "";

    while (true ) {

    Token token =lexer.yylex();

    if (token== null){

    resultado= resultado+"EOF";

    jTextArea1.setText(resultado);

    return;

    }

    switch (token){

    case ERROR:

    resultado=resultado+"EOF";

    jTextArea1.setText(resultado);

    return;

    }

    switch (token){

    case ERROR:

  • resultado=resultado+ "Error, simbolo no reconocido \n";

    break;

    case CARACTER: case ENTERO:

    resultado=resultado+ "TOKEN: " + token + " " + lexer.lexeme + "\n";

    break;

    default:

    resultado=resultado+"TOKEN: " + token + "\n";

    Accin del botn Analizar.

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    try{

    probarLexerFile();

    }

    catch (IOException ex){

    System.out.println(ex.getMessage());