Sie sind auf Seite 1von 4

JFlex

Un generador de analizadores lxicos


Carlos Orlando Paiz Raymundo
2011 45962

JFlex, un generador de Analizadores Lxicos


La herramienta JFlex es una implementacin que permite generar un analizador lxico de
acuerdo a un conjunto de reglas lxicas que se especifican para describir patrones de los
tokens y as poder reconocer cadenas de cumplan con dichas reglas.

Reglas_Lxicas.flex

JFlex

programa.java

La velocidad suele ser proporcional a la cantidad en la entrada de caracteres. El nmero o


complejidad de la regla solo influye sobre el tamao del autmata.
El formato general para la especificacin lxica es de la siguiente forma:
{ Cdigo de usuario }
%%
{ Opciones y declaraciones }
%%
{ Reglas lxicas }

Cdigo de usuario: se especifica el cdigo auxiliar necesario para el traductor lxico, el cual
se copia tal y como aparece en el inicio del cdigo fuente, como los package o los import.
Opciones y declaraciones
a. Opciones del cdigo generado:
%class nombre Especifica el nombre de la clase generada como salida de JFlex.
%line y %column activan cuenta de lneas (yyline) y columnas (yycolumn) respectivamente.
%standalone Genera programa que acepta un fichero de entrada en lnea de comando.
%debug Durante la ejecucin muestra: n lnea de la especificacin, lexema reconocido y
accin ejecutada.
b. Cdigo fuente especfico:
%{ %} Cdigo copiado tal cual en la clase.
%init{ %init} Cdigo copiado tal cual en el constructor de la clase.
%eofval{ %eofval} Cdigo que se ejecutar cada vez que alcanzamos un final de
fichero.

Reglas lxicas
Formato: expresin { acciones }
Funcionamiento: Cuando se detecta un lexema que cumple el patrn definido en la
expresin se ejecutan las acciones asociadas (cdigo java).
Especificacin de las expresiones:
expresiones regulares: sean a y b expresiones vlidas
a | b Unin
a b Concatenacin
a* Repeticin 0 o N veces
a+ Repeticin 1 o N veces (= a a*)
a? Opcionalidad
!a Negacin
~a Cualquier cosa que termine en a.
{ nombre } Utilizacin de una macro
Cadena de caracteres
[] Clases de caracteres
Algunas predefinidas:
. Cualquier carcter excepto \n
[:letter:] Letras
[^] Complementario de clases de caracteres.

Caracteres especiales:
|(){}[]<>\.*+?^$/."~!
Al introducir nuestro fichero de especificacin en el JFlex, generar una nueva clase llamada
analizador lxico que ser la que se utilizar en el compilador. Para poder utilizarla o bien se
recompila en tiempo de ejecucin aadiendo la clase al proyecto, o se vuelve a compilar el
proyecto entero.
yytext es un apuntador al inicio del lexema.
yylenght es la longitud del lexema encontrado.
Cuando varios prefijos de la entrada coinciden con uno ms patrones:
1. Preferir siempre un prefijo ms largo a uno ms corto.
2. Si el prefijo ms largo posible coincide con dos o ms patrones, preferir el patrn que
se lista primero en el programa.

Documentacin de JFlexEjemplo1 (de ejemplo1 proporcionado con ANTLR)


Se cre un nuevo proyecto y una nueva clase de tipo enum en donde se definieron los tokens
para su enumeracin consecutiva:
public enum Token {
WS, NUMBER, OPERATOR, PARENTHESIS, SEPARATOR, ERROR
}

Luego se definieron las reglas lxicas en un nuevo empty file guardndolo con la
extensin .flex
package Ejemplo1;
import static Ejemplo1.Token.*;
%%
%class Lexer
%type Token
digit = [0-9]
ws = [ \t\r\n]
number = {digit}+("."{digit}+)?
%{
public String lexeme;
%}
%%
{ws} {/*Ignore*/}
"("|")" {lexeme=yytext(); return PARENTHESIS;}
"+" {lexeme=yytext(); return OPERATOR;}
"*" {lexeme=yytext(); return OPERATOR;}
"-" {lexeme=yytext(); return OPERATOR;}
"/" {lexeme=yytext(); return OPERATOR;}
{number} {lexeme=yytext(); return NUMBER;}
";" {return SEPARATOR;}
. {return ERROR;}

En la clase principal se cre un mtodo que recibe como parmetro una cadena, contiene
una instancia de File y crea un nuevo archivo y que se pasa como parmetro a una funcin
generate de la librera de JFlex previamente includa y luego en main se llama al mtodo
que recibe el path del archivo .flex que se cre anteriormente. As al ejecutar el programa se
genera la clase con el mismo nombre del archivo .flex y que contiene el cdigo java para el
anlisis lxico. Posteriormente se realiz una interfaz que permite el ingreso de lneas de
texto para su evaluacin mediante un mtodo que escribe en un archivo .txt el texto
ingresado por el usuario y que luego se lee el .txt mediante la clase generada.

Das könnte Ihnen auch gefallen