analizador léxico

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.

Upload: pedro-reyes

Post on 03-Jan-2016

306 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Analizador léxico

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.

Page 2: Analizador léxico

Analizador léxico.

Un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase de un

compilador consistente en un programa que recibe como entrada el código fuente de otro programa

(secuencia de caracteres) y produce una salida compuesta de tokens (componentes léxicos) o

símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la entrada

para el analizador sintáctico (en inglés parser).

Pasos para crear un analizador léxico en JAVA.

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

unidad C:

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

Page 3: Analizador léxico

3. Le damos clic en el botón New Library y le asignamos un nombre a nuestra librería, en este

caso se llama JFlex. Posteriormente añadimos la ruta donde se encuentra el archivo

JFlex.jar, picando en el botón 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.

Page 4: Analizador léxico

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

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

Page 5: Analizador léxico

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

Lexer y le asignaremos la extensión .flex, a este archivo le indicaremos las reglas léxicas

para nuestras expresiones

Page 6: Analizador léxico

6.- A continuación crearemos una clase numerada, que llamaremos Token en la cual

contendrá los tokens a utilizar en nuestra aplicación.

Page 7: Analizador léxico

7.- Importamos nuestra librería JFlex, para poder crear un archivo Lexer.java el cual nos

ejecutara nuestro analizador léxico. Posteriormente en nuestro archivo main definimos la

variable de entorno path para generar nuestro analizador léxico, el cual se generará al

ejecutar la clase main.

Page 8: Analizador léxico

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

Page 9: Analizador léxico

9.- Diseñamos nuestra interfaz, empleando dos etiquetas (label), un botón (Button), una caja de

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

10.- Posteriormente creamos una clase pública que nos permitirá ejecutar el analizador léxico y

que nos mostrará el resultado. En este caso, el código 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 número entero, un signo o una cadena caracteres en el área de texto.

Page 10: Analizador léxico

11.- Al botón Analizar se le pondrá el siguiente código, el cual ejecutará una acción para que se

inicialice el analizador léxico y en caso de error imprima un mensaje.

12.- Finalmente, ejecutamos nuestra interfaz, ingresamos el texto o carácter y analizamos.

Page 11: Analizador léxico

Código.

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;

Page 12: Analizador léxico

%}

%%

{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

}

Page 13: Analizador léxico

Clase pública 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:

Page 14: Analizador léxico

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

Acción del botón Analizar.

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

try{

probarLexerFile();

}

catch (IOException ex){

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