Analizador léxico
-
Upload
pedro-reyes -
Category
Documents
-
view
313 -
download
3
Transcript of 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.
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.
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.
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 extensión .flex, a este archivo le indicaremos las reglas léxicas
para nuestras expresiones
6.- A continuación crearemos una clase numerada, que llamaremos Token en la cual
contendrá los tokens a utilizar en nuestra aplicación.
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.
8.- Creamos nuestra interfaz con un archivo JFrame, el cual nombraremos como Interfaz.
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.
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.
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;
%}
%%
{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 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:
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());