Professional Documents
Culture Documents
2 3 JLex PDF
2 3 JLex PDF
• Lex en Java
• Java debe estar instalado. • Generación del explorador (JLex -> Java):
– http://java.sun.com/ – java JLex.Main fichero.lex
– J2SE(TM) Development Kit • Compilación del explorador (Java -> Byte-Code):
– (JRE – Java Runtime environment no es suficiente) – javac fichero.lex.java
• Escoger el directorio p.e., [c:\java\ ] • Ejecurtar explorador
• Creamos un subdirectorio llamado JLex en el directorio – java Yylex
escogido en el punto 1. [c:\java\JLex] • (Yylex es el nombre por defecto)
import java.io.*;
// Sección de código de usuario
• La función yylex( ) implementa el autómata de la (...)
gramática. %%
// Sección de directivas
%{
public static void main (String argv[])
• Identifica el patrón que encaja con la entrada actual y throws java.io.IOException {
retorna el testigo correspondiente al lexema identificado Yylex yy = new Yylex(System.in);
que, por defecto, es de tipo Yytoken. while (yy.yylex() != -1) ; }
%}
(...)
%%
// Sección de reglas léxicas
(...)
• Todo carácter del lenguaje es una expresión regular que se • El asterisco (*) representa la clausura de Klenne
representa a sí mismo, excepto el espacio en blanco (ya que es un • El signo suma (+) encaja con una o más repeticio
delimitador) y los metacaracteres. • El interrogante (?) encaja una o ninguna repetición
– Ej.: a {System.out.println("Caracter a encontrado");}
• El punto . encaja con cualquier carácter excepto nueva línea
• carácter dólar ($) denota el final de una línea.
• Los corchetes ([...]) denotan una clase de caracteres
• El carácter (^) denota el inicio de una línea.
– [abc]
• Dos expresiones regulares consecutivas representan su • El guión (-) se utiliza para definir un rango de caracteres
concatenación. E.j.: ab es ‘a’ concatenado con ‘b’ – [a-z]
• Dos expresiones regulares separadas por la barra vertical ( | ), • El circumflejo (^), situado después de la apertura del corchete indica
representa la opción entre ambas la negación de la clase.
• Los paréntesis se utilizan para agrupar expresiones regulares. E.j. – [^abc] encaja con cualquier carácter que no sea ‘a’, ni ‘b’, ni ‘c’.
agu(a|v)ino encaja ‘aguaino’ o ‘aguvino’.
• [^a-zA-z] Cualquier carácter que no sea letra mayúscula ni • En una especificación léxica, pueden darse las siguientes
minúscula. situaciones:
• ["A-Z"] Los caracteres ‘A’, ‘Z’ o ‘-‘ (guión). – Dos o más reglas encajan con una misma entrada o lexema.
• [A-Z][a-z ]* Texto que empieza por letra mayúscula. – Una regla encaja con un lexema y una segunda regla encaja con un
• [[A-Z][a-z]] Expresión ilegal. fragmento de este lexema.
• [\[a-z\]] Letra minúscula, o apertura o cierre de corchetes. • JLex resuelve esta ambigüedad aplicando los siguientes
• [a-z*] Letra minúscula o asterisco. criterios:
• [+-] El carácter ‘+’ o el ‘-‘. – Si más de una regla encaja con un fragmento de la entrada, se elige
• [+-/] Los caracteres entre ‘+’ (ASCII 43) y ‘/’ (ASCII 47). una regla que encaja con la cadena más larga.
• [(ab)] Los caracteres ‘a’, ‘b’, apertura ‘(’ o cierre de paréntesis ‘)’ – Si más de una regla encaja con la misma cadena, se elige la regla que
se encuentra en primera posición de entre ellas.
• Las acciones léxicas consiste en código Java entre llaves: • Las acciones léxicas pueden incluir la sentencia
{ Código_Java }
return(...)
• Valores léxicos:
yytext(): Función que nos retorna el fragmento de entrada para que la función yylex(...) retorne el valor o testigo
identificado. que deseamos a la función que la ha invocado
yychar: Entero que contiene la posición, dentro el fichero de entrada,
(en un compilador, el analizador sintáctico).
del primer carácter del lexema actual.
yyline: Entero con el número de línea donde se encuentra
Ej.: [a-zA-Z][a-zA-Z_0-9]*
{System.out.print ("Identificador:"+ yytext());}
• La función yylex() retorna, por defecto, un valor de tipo Yytoken. • El explorador generado por JLex necesita un símbolo
class Yylex {...
para representar el valor de final de fichero (EOF).
public Yytoken yylex () { – Por defecto, este valor es: null.
... }
• Para modificar el tipo retornado se dispone de: •%yyeof - declara la constante entera Yylex.YYEOF
– %integer: la función yylex() generada retorna un valor de tipo int: – public final int YYEOF = -1;
class Yylex {...
public int yylex () {
... } •%eofval{ ...%eofval}
– %intwrap - java.lang.Integer – permite al usuario escribir código Java que será copiado en la función
class Yylex {... yylex () y que se ejecutará cuando llegueal final de fichero.
public java.lang.Integer yylex () {
... }
• %type - puede definirse cualquier tipo
• Código añadido a la clase •%full Con esta directiva se pueden utilizar los 255
%{ caracteres de ASCII
...<Código>... – Por defecto, el explorador generado lee y escribe en ficheros de texto
%} ASCII. Esta tabla de caracteres contiene los códigos, con tamaño de
carácter de siete bits, comprendidos entre 0 (NUL) y 127 (sin
• Código de inicialización de la clase (añade al constructor): representación).
%init{
...<Código>...
•%unicode – caracteres unicode
– Debe usarse el constructor java.io.Reader
%init}
•%notunix
• Código de tratamiento de excepciones
– retorno de carro (\r) y el de nueva línea (\n) se reconocen como un
%initthrow{
solo carácter de nueva línea.
excepción1 [, excepción2 [,...]]
• Unix (\n) Windows (\r\n)
%initthrow}