Upload
carlos-castaneda
View
16
Download
0
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());