Vous êtes sur la page 1sur 14

Universidad Autnoma de Guerrero. Unidad Acadmica de Ingeniera.

COMPILADORES
Analizador Lxico en Java.

Elizabeth Giles Hernndez


Semestre 6. Chilpancingo, Gro. 12 de Julio del 2013

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());

Vous aimerez peut-être aussi