Professional Documents
Culture Documents
Lex en Java
JLex es un analizador Lexico en Java.
JLex
http://www.cs.princeton.edu/~appel/modern/java/JLex/
Instalacin JLex
Ejecurtar explorador
java Yylex
(Yylex es el nombre por defecto)
Cdigo Generado
El explorador se implementa
con una clase que, por
defecto, tiene el nombre
Yylex.
Funcin yylex()
Ej:
[a-zA-Z][a-zA-Z_0-9]*
{System.out.println
("Identificador");)
Expresiones Regulares
Todo carcter del lenguaje es una expresin regular que se
representa a s mismo, excepto el espacio en blanco (ya que es un
delimitador) y los metacaracteres.
Ej.: a {System.out.println("Caracter a encontrado");}
Metacaracteres
Metacaracteres: ? * + | ( ) ^ $ [ ] { } " \
Para utilizarlos se puede:
Expresiones Regulares II
El asterisco (*) representa la clausura de Klenne
El signo suma (+) encaja con una o ms repeticio
El interrogante (?) encaja una o ninguna repeticin
El punto . encaja con cualquier carcter excepto nueva lnea
Los corchetes ([...]) denotan una clase de caracteres
[abc]
Ejemplos
[^a-zA-z] Cualquier carcter que no sea letra mayscula ni
minscula.
["A-Z"] Los caracteres A, Z o - (guin).
[A-Z][a-z ]* Texto que empieza por letra mayscula.
[[A-Z][a-z]] Expresin ilegal.
[\[a-z\]] Letra minscula, o apertura o cierre de corchetes.
[a-z*] Letra minscula o asterisco.
[+-] El carcter + o el -.
[+-/] Los caracteres entre + (ASCII 43) y / (ASCII 47).
[(ab)] Los caracteres a, b, apertura ( o cierre de parntesis )
Acciones Lxicas
Las acciones lxicas consiste en cdigo Java entre llaves:
{ Cdigo_Java }
Ambigedad
En una especificacin lxica, pueden darse las siguientes
situaciones:
Dos o ms reglas encajan con una misma entrada o lexema.
Una regla encaja con un lexema y una segunda regla encaja con un
fragmento de este lexema.
Recursividad
Las acciones lxicas pueden incluir la sentencia
return(...)
Valores lxicos:
yytext(): Funcin que nos retorna el fragmento de entrada
identificado.
yychar: Entero que contiene la posicin, dentro el fichero de entrada,
del primer carcter del lexema actual.
yyline: Entero con el nmero de lnea donde se encuentra
Ej.: [a-zA-Z][a-zA-Z_0-9]*
Recursividad Ejemplo
import java.io.*;
import java.lang.Integer;
%%
%{
public static void main (String argv[]) throws java.io.IOException {
Integer resultado ;
Yylex yy = new Yylex(System.in);
do {
resultado=yy.yylex();
System.out.println ("yylex() retorna el dgito: " + resultado);
} while (resultado != null) ;
}
%}
%intwrap
%%
[\t\r\n ]+
{
}
[0-3]
{ }
[4-6]
{ return yylex(); }
[7-9]
{ return Integer.valueOf( yytext()); }
[^0-9]+
{ System.out.println(yytext() +
" -> No es un dgito!! " );}
Procesadores de lenguaje JLex
Salvador Sanchez, Daniel Rodrguez
Estados - Ejemplo
<YYINITIAL>"/*"
{ yybegin (CCOMMENT); }
<CCOMMENT>[^*]*"*/" { System.out.println ("Comentario: <" +
yytext().substring(0,yytext().length()2)+">");
yybegin (YYINITIAL); }
<YYINITIAL>[^/]*
{ }
Estados
Es posible encontrar varios componentes con diferentes significados
en funcin del lugar donde aparezcan dentro del fichero de entrada.
Ej., en C: int var1; /* var1 */
[<ESTADO1 [,ESTADOn ...]]>] regla_con_estado { accin }
Seccin Directivas
1. Directivas. Se inician % seguidas de un identificador de directiva.
Hay diferentes tipos siguientes:
Directivas que afectan a las reglas lxicas.
Directivas que afectan al formato de la entrada o salida
Directivas que particularizan las propiedades de la clase del explorador
3. Declaracin de macros.
Las macros utilizadas en la seccin de reglas lxicas tienen que declararse en
esta seccin.
Declaracin de macros
La declaracin de una macro es una secuencia de la forma:
nombre = expresin_regular
Ejemplo:
digito = [0-9]
alfa = [a-zA-Z]
entero = <digito>+
Notas:
El (=) puede, ir precedido y seguido por espacios y tabuladores.
Cada definicin de macro debe caber en una sola lnea.
El nombre de la macro debe ser un identificador vlido (secuencia de
letras, dgitos y subrallados, iniciada con una letra o subrallado).
La regla que define la macro debe ser una expresin regular vlida.
Las definiciones de macros pueden contener otras macros, delimitando los
nombres con los < y >. No se permite que una macro se incluye a s
misma en su definicin.
Sensibilidad a maysculas
%ignorecase
//Ejemplo 1
%%
%%
[a-zA-Z]+ {...}
%eofval{ ...%eofval}
permite al usuario escribir cdigo Java que ser copiado en la funcin
yylex () y que se ejecutar cuando llegueal final de fichero.
//Ejemplo 2
%%
%ignorecase
%%
[a-z]+ {...}
Ejemplo %eofval
%class nombreClase
cambia el nombre de la clase
%public
La hace publica
%eofval{
return 0;
%eofval}
%type double
%function nombreFuncin
Cambia el nombre de la funcion yylex()
%implements nombreInterface
class Yylex implements nombreInterface { ...
%%
// Reglas lxicas .
Directivas
ninguna
%class Scanner
%function Tokenizer
%public
Cdigo
Generado
class Yylex {
...
public Yytoken yylex ()
%notunix
retorno de carro (\r) y el de nueva lnea (\n) se reconocen como un
solo carcter de nueva lnea.
Unix (\n) Windows (\r\n)