Download Biblioteca de la UNS - Universidad Nacional del Santa

Document related concepts
no text concepts found
Transcript
UNIVERSIDAD NACIONAL DEL SANTA
FACULTAD DE INGENIERIA
DEPARTAMENTO DE INGENIERIA CIVIL Y DE SISTEMAS E INFORMATICA
E.A.P. INGENIERIA DE SISTEMAS E INFORMATICA
TEORIA DE LENGUAJES Y COMPILADORES
PRACTICA DIRIGIDA Nº 1
I. Objetivo
Utilizar herramientas para generar analizadores lexicográficos
II. Pre-Requisitos
 Conocimientos del lenguaje de programación java en el entorno de NetBeans
 Conocimiento de teoría de autómatas y expresiones regulares
III. Desarrollo
a. Descargar JFLex
1.
Descargar el JFlex de la página oficial: http://www.jflex.de/download.html
2.
Desempaquetar el archivo: jflex-1.4.3.zip
3.
Buscar la librería de JFLEX que debe estar localizada en:
JFLEX-1.4.3\JFLEX-1.4.3\LIB
Con el nombre: JFlex de tipo Executable Jar File
4.
Copiar dicha librería en una carpeta que permitirá una rápida localización al
integrarlo en NetBeans
b. Integrar JFlex en NetBeans
1.
Ejecutar la aplicación NetBeans IDE
Integrar la librería JFlex en NetBeans IDE
2.
i.
En el menú Herramientas (tools), dar clic en Añadir librerías (ant
Library)
ii.
Dar clic en nueva librería (New Library)
iii.
En nombre Librería (Library Name) digitar JFlex y dar clic en Aceptar
(OK)
iv.
Dar clic en Añadir Jar/Carpeta (Jar/Folder)
v.
Localizar la librería JFlex copiada anteriormente en la carpeta de rápida
localización y dar clic en Añadir Jar/Carpeta (Jar/Folder)
vi.
Dar clic en aceptar (OK), para finalizar la integración de JFlex en
NetBeans. Es decir, ya se agregó la librería JFlex a NetBeans.
c. Crear un proyecto para un analizador lexicográfico
1.
Crear un nuevo proyecto Java Application
2.
El nombre del proyecto será: JFlexNetBeans
3.
Dar clic en Terminar (Finish)
4.
Agregar un archivo vacío: JFlexNetBeans – Nuevo - Otro
En categoría seleccionar: otro (Others)
En tipo de archivo seleccionar: Archivo vacío (Empty file)
Dar clic en Siguiente (Next)
5.
En Nombre de Archivo (File Name) digitar: Lexer.flex
6.
Dar clic en Terminar (Finish)
7.
Digitar el siguiente código y luego dar clic en grabar.
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 ASSIGN;}
"+" {return SUMA;}
"*" {return MULT;}
"-" {return RESTA;}
"/" {return DIV;}
{L}({L}|{D})* {lexeme=yytext(); return ID;}
("(-"{D}+")")|{D}+ {lexeme=yytext(); return INT;}
. {return ERROR;}
8.
Agregamos una nueva clase de tipo enum
Seleccionamos Nuevo – Otro (New - Other)
En nombre de la clase digitamos: Token
Luego damos clic en Terminar (Finish)
En el método enum , definimos todos los tokens.
public enum Token {
ID, INT, SUMA, RESTA, DIV, MULT, ASSIGN, ERROR
}
Luego dar clic en guardar
9.
Agregamos la biblioteca JFlex
Damos clic en añadir librería (Add Library)
10. En la clase principal Main.java
Agregar despues de package jflexnetbeans;
import java.io.File;
En el método main, escribimos:
String path = " C:/UNS/Practicas/JAVA/JFlexNetBeans/src/jflexnetbeans/Lexer.flex";
generarLexer(path);
La ruta puede variar en cada computador, para ello debe buscar el archivo
Lexer.flex y reemplazar dicha ruta.
Luego agregar la clase generarLexer:
public static void generarLexer(String path){
File file=new File(path);
JFlex.Main.generate(file);
Quedando de esta manera:
Luego ejecutamos la clase principal Main.java para generar la clase
Lexer.java
Hasta aquí ya se creo el analizador lexico
d. Creando la interfaz para el analizador lexicográfico
1. Agregando un formulario
El nombre de la clase será: interfaz
Luego dar clic en Terminar (Finish)
Agregamos los controles al formulario como se muestra a continuacion:
Etiqueta:
“Ingrese el texto”
Caja de texto:
Para ingresar la cadena a analizar
Botón:
“Analizar”
Etiqueta:
“Resultado”
Área de texto:
Para mostrar los resultados
Los nombres son los establecidos por defecto.
2.
Agregar el método probarLexerFile como se indica a continuación:
public void probarLexerFile() throws IOException{
File fichero = new File ("fichero.txt");
PrintWriter writer;
try {
writer = new PrintWriter(fichero);
writer.print(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";
jTextField1.setText(resultado);
return;
}
switch (token){
case ERROR:
resultado=resultado+ "Error, símbolo no reconocido \n";
break;
case SUMA:
resultado=resultado+ "TOKEN SUMA \n";
break;
case RESTA:
resultado=resultado+ "TOKEN RESTA \n";
break;
case MULT:
resultado=resultado+ "TOKEN MULT \n";
break;
case DIV:
resultado=resultado+ "TOKEN DIV \n";
break;
case ASSIGN:
resultado=resultado+ "TOKEN ASSIGN \n";
break;
case ID:
resultado=resultado+ "TOKEN ID <" + lexer.lexeme + "> \n";
break;
case INT:
resultado=resultado+ "TOKEN INT <" + lexer.lexeme + "> \n";
break;
default:
resultado=resultado+ "TOKEN <"+ lexer.lexeme + "> ";
}
}
}
3.
Agregar el código al botón analizar
try{
probarLexerFile();
}
catch (IOException ex){
System.out.println(ex.getMessage());
}
4.
Probando el analizador: Seleccionar la clase interfaz.java
luego Run File
Viendo los resultados:
e. Tarea
Escribir expresiones regulares para números reales y agregarlos en el archivo
Lexer.flex y realizar las pruebas del caso.