You are on page 1of 27

JLex: Un generador de analizador lxico para Java (TM)

Elliot Berk Departamento de Ciencias de la Computacin de la Universidad de Princeton Versin 1.2, 05 de mayo 1997 Manual de revisin 29 de octubre 1997 ltima actualizacin 06 de septiembre 2000 para JLex 1.2.5 (ltima versin se puede obtener de http://www.cs.princeton.edu/ ~ appel / moderna / java / JLex / )

Contenido

1. Introduccin 2. Especificaciones JLex o 2.1 Cdigo de Usuario o 2.2 Directivas JLex 2.2.1 Reglamento Interno de la clase analizador lxico 2.2.2 Cdigo de inicializacin de la clase analizador lxico 2.2.3 Cdigo de fin de archivo de clase del analizador lxico 2.2.4 Definiciones de macros 2.2.5 Declaraciones de los Estados 2.2.6 Recuento de caracteres 2.2.7 Lnea de conteo 2.2.8 Java COPA Compatibilidad 2.2.9 Ttulos de componentes lxicos Analyzer 2.2.10 defecto Token Tipo 2.2.11 defecto Token Tipo II: Integer Envuelto 2.2.12 YYEOF el final de su archivo 2.2.13 Newlines y compatibilidad del sistema operativo 2.2.14 Juegos de caracteres 2.2.15 Formato de caracteres ay desde archivos

2.2.16 Excepciones generadas por acciones lxicas 2.2.17 Especificacin del valor devuelto al final de su archivo 2.2.18 Especificacin de una interfaz a implementar 2.2.19 Hacer que el pblico de clase generados o 2.3 Reglas de expresiones regulares 2.3.1 Estados lxicas 2.3.2 Expresiones Regulares 2.3.3 Acciones Asociadas 2.3.3.1 Acciones y recursividad: 2.3.3.2 Transiciones de estado: 2.3.3.3 Valores lxicos disponibles: 3. Analizadores lxicos generados 4. Rendimiento 5. Cuestiones de aplicacin o 5.1 Funciones no implementadas o Unicode 5.2 vs Ascii o 5.3 Las comas en las listas estatales o 5.4 Wish Lista de caractersticas no implementadas 6. Crditos y derechos de autor o 6.1 Crditos o 6.2 Derechos de autor

1. Introduccin
Un analizador lxico rompe un flujo de entrada de caracteres en tokens. Escribir analizadores lxicos a mano puede ser un proceso tedioso, por lo que las herramientas de software han sido desarrollados para facilitar esta tarea. Tal vez la ms conocida de estas utilidades es Lex. Lex es un generador de analizadores sintcticos para el sistema operativo UNIX, orientado al lenguaje de programacin C. Lex toma un archivo de especificacin de formato especial que contiene los detalles de un analizador lxico. Esta herramienta se crea un archivo de cdigo fuente C para el analizador lxico por tablas asociadas.

La utilidad JLex se basa en el modelo de generador de analizador lxico Lex. JLex toma un archivo de especificacin similar al aceptado por Lex, a continuacin, crea un archivo de cdigo fuente de Java para el analizador lxico correspondiente.

2. Especificaciones JLex
Un archivo de entrada JLex est organizado en tres secciones, separadas por directivas de dos por ciento (``%%''). Una especificacin adecuada JLex tiene el siguiente formato. cdigo de usuario %% JLex directivas%% expresiones regulares gobierna El ``%%'' directivas distinguen las secciones del archivo de entrada y se deben colocar al principio de su lnea. El resto de la lnea que contiene los%% directivas ``'' puede ser desechado y no debe utilizarse para albergar declaraciones o de cdigo adicionales.

La seccin de cdigo de usuario - la primera seccin del archivo de especificacin - se copia directamente en el archivo de salida resultante. Esta rea de la memoria ofrece un espacio para la implementacin de clases de utilidad o tipos de devolucin. La seccin de directivas JLex es la segunda parte del archivo de entrada. A continuacin, se dan las definiciones y los nombres de las macros estatales se declaran. La tercera seccin contiene las reglas de anlisis lxico, cada uno de los cuales consta de tres partes: una lista de estado opcional, una expresin regular, y una accin.

2.1 Cdigo de Usuario


Cdigo de usuario precede a la primera directiva doble por ciento (``%% '). Este cdigo se copia literalmente en el archivo de origen analizador lxico que las salidas JLex, en la parte superior del archivo. Por lo tanto, si el archivo de origen analizador lxico debe comenzar con una declaracin del paquete o con la importacin de una clase externa, la seccin de cdigo de usuario debe comenzar con la declaracin correspondiente. Esta declaracin se puede copiar en la parte superior del archivo de cdigo fuente generado.

2.2 Directivas JLex


La seccin de directiva JLex comienza despus de la primera ``%%'' y contina hasta que el segundo ``%%'' delimitador. Cada directiva JLex debe estar contenido en una sola lnea y debe comenzar la lnea.

2.2.1 Reglamento Interno de la clase analizador lxico El % {...%} directiva permite al usuario escribir cdigo Java que desea copiar en la clase de anlisis lxico. Esta directiva se utiliza como sigue. % { <code> %} Para ser reconocido correctamente, el % { y %} cada uno debe estar situado en el principio de una lnea. El cdigo Java especificado en <cdigo> ser luego se copia en la clase de analizador lxico creado por JLex. clase yylex { ... <cdigo> ... } Esto permite que la declaracin de variables y funciones internas de la clase analizador lxico generado. Los nombres de variables comienzan con yy se debe evitar, ya que estos estn reservados para el uso de la clase analizador lxico generado.

2.2.2 Cdigo de inicializacin de la clase analizador lxico El {init% ... % Init} directiva permite al usuario escribir cdigo Java para ser copiado en el constructor de la clase analizador lxico. % init { <cdigo> % init} El init {% y % init} directivas debe situarse al principio de una lnea . El cdigo Java especificado en <cdigo> ser luego se copia en el constructor de la clase analizador lxico. clase yylex { yylex () { ... <cdigo> ... } } Esta directiva permite la inicializacin de una sola vez de la clase de anlisis lxico desde el interior de su constructor. Los nombres de variables comienzan con yy se debe evitar, ya que estos estn reservados para el uso de la clase analizador lxico generado.

El nmero de referencia indicado en el {init% ... % Init} directiva puede potencialmente generar una excepcin o propagarla desde otra funcin. Para declarar esta excepcin, utilice el % initthrow {... % Initthrow}directiva. % initthrow { <exception[1]> [ , <exception[2]>, ... ] % initthrow} El cdigo Java se especifica aqu se copiar en la declaracin del constructor analizador lxico. yylex () lanza <exception[1]> [ , <exception[2]>, ... ] { ... <cdigo> ... } Si el cdigo Java dada en el {init% ... % Init} directiva se produce una excepcin que no se declara, el archivo de origen analizador lxico resultante no puede compilar correctamente.

2.2.3 Cdigo de fin de archivo de clase del analizador lxico El % eof {... % Eof} directiva permite al usuario escribir cdigo Java que desea copiar en la clase de anlisis lxico de ejecucin tras el fin de archivo se alcanza. % eof { <code> % eof} El % eof { y }% eof directivas debe estar situado en el principio de una lnea. El cdigo Java especificado en <cdigo> se ejecutar a lo sumo una vez, e inmediatamente despus de la de fichero final se alcanza para el archivo de entrada de la clase analizador lxico est procesando.

El cdigo que figura en el % eof {... % Eof} directiva puede potencialmente generar una excepcin o propagarla desde otra funcin. Para declarar esta excepcin, utilice el % eofthrow {... % Eofthrow} directiva. % eofthrow { <exception[1]> [ , <exception[2]>, ... ] % eofthrow} El cdigo Java se especifica aqu se copiar en la declaracin de la funcin de analizador lxico llamado a la limpieza hasta al llegar al final de su archivo. void yy_do_eof privada () throws <exception[1]> [ , <exception[2]>, ... ] { ... <cdigo> ... } El cdigo Java en <cdigo> que conforma el cuerpo de esta funcin, en parte, vienen con el cdigo que figura en el % eof {... % Eof} directiva. Si este cdigo produce una excepcin que no est declarada utilizando el % eofthrow {... % Eofthrow} Directiva, el analizador lxico resultante no puede compilar correctamente.

2.2.4 Definiciones de macros Las definiciones de macros se presentan en la seccin de directivas JLex de la especificacin. Cada definicin de macro est contenido en una sola lnea y consta de un nombre de macro seguido de un signo igual (=), luego por su definicin asociada. Por tanto, el formato se puede resumir de la siguiente manera. <nombre> = <definition> espacios en blanco no salto de lnea, por ejemplo, espacios en blanco y tabuladores, es opcional entre el nombre de la macro y el signo igual y entre el signo igual y la definicin de la macro. Cada definicin de macro debe estar contenido en una sola lnea. Los nombres de macro deben ser identificadores vlidos, por ejemplo, secuencias de letras, dgitos y guiones que comienzan con una letra o un guin bajo. Las definiciones de macros deben ser expresiones regulares vlidos, los detalles de los cuales se describen en otra seccin a continuacin. Las definiciones de macros pueden contener otras expansiones de macros, en la norma {} <nombre> formato para macros en expresiones regulares. Sin embargo, el usuario debe tener en cuenta que estas expresiones son macros - no funciones o no terminales - lo construcciones mutuamente recursivas utilizando macros son ilegales. Por lo tanto, los ciclos en las definiciones de macro tendr resultados impredecibles.

2.2.5 Declaraciones de los Estados

Estados lxicos se utilizan para controlar cundo ciertas expresiones regulares coinciden. stos se declaran en las directivas JLex de la siguiente manera. Estado% Estado [0] [ , estatales [1], el estado [2], ... ] Cada declaracin de una serie de estados lxicos debe estar contenido en una sola lnea. Declaraciones mltiples pueden ser incluidos en la misma especificacin JLex, por lo que la declaracin de muchos estados se puede dividir en muchas declaraciones en varias lneas. Nombres estatales deben ser identificadores vlidos, por ejemplo, secuencias de letras, dgitos y guiones que comienzan con una letra o un guin bajo. Un solo estado lxica se declara implcitamente JLex. Este estado se llama YYINITIAL y el analizador lxico generado que comience el anlisis lxico en este estado. Reglas de anlisis lxico comienzan con una lista del estado opcional. Si se da una lista del estado, la regla lxica slo es comparable cuando el analizador lxico se encuentra en uno de los estados especificados. Si no se da una lista del estado, la regla lxica se corresponde cuando el analizador lxico es en cualquier estado. Si una especificacin JLex no hace uso de los Estados, ni por declarar los estados ni precedentes reglas lxicas con las listas estatales, el analizador lxico resultante permanecer en estado YYINITIAL durante la ejecucin.Puesto que las reglas lxicas no van precedidos de listas estatales, estas reglas se corresponden en todos los Estados existentes, incluyendo el estado declarado implcitamente YYINITIAL . Por lo tanto, todo funciona como se espera si los estados no se utilizan en absoluto. Los Estados se declaran como enteros constantes dentro de la clase analizador lxico generado. La constante entera declarado para un estado declarado tiene el mismo nombre que ese estado. El usuario debe tener cuidado para evitar el conflicto de nombres entre los nombres de los estados y las variables declaradas en la parte de accin de las normas o en otro lugar dentro de la clase de anlisis lxico. Una convencin conveniente sera declarar nombres de estado en todas las capitales, como un recordatorio de que estos identificadores se convierten efectivamente constantes.

2.2.6 Recuento de caracteres Recuento de caracteres est desactivado por defecto, pero se puede activar con la charla% directiva. % char El ndice basado en cero del primer carcter de la regin acompaado del texto se coloca en la variable enterayychar .

2.2.7 Lnea de conteo Conteo Line est desactivado por defecto, pero se puede activar con la lnea% directiva. lnea% El ndice de lnea de base cero en el inicio de la regin acompaado del texto se coloca en la variable entera yyline .

2.2.8 Java COPA Compatibilidad Java CUP es un generador de analizadores sintcticos para Java escrito originalmente por Scott Hudson de la Universidad de Georgia Tech, y mantenido y ampliado por Frank Flannery, Wang Dan, y C. Scott Ananian.Los detalles de esta herramienta de software estn en la World Wide Web en http://www.cs.princeton.edu/ ~ appel / moderna / java / CUP / . Java compatibilidad COPA est desactivado por defecto, pero se puede activar con el siguiente Directiva JLex. % taza cuando se dan, esta directiva hace que el analizador generado se ajusta a la java_cup.runtime.Scanner interfaz. Tiene el mismo efecto que las tres directivas siguientes: % implementa java_cup.runtime.Scanner % funcin next_token % Tipo java_cup.runtime.Symbol Consulte la siguiente seccin para ms detalles sobre estas tres directivas, y el manual de COPA para ms detalles sobre el uso COPA y JLex juntos.

2.2.9 Ttulos de componentes lxicos Analyzer Las siguientes directivas se pueden utilizar para cambiar el nombre de la clase generada analizador lxico, la funcin de creacin de testigos, y el tipo de retorno token. Para cambiar el nombre de la clase del analizador lxico yylex , utilice la clase% directiva. % <nombre> clase Para cambiar el nombre de la funcin Tokenizacin de yylex , utilice la funcin% directiva. % Funcin <nombre> Para cambiar el nombre de el tipo de retorno de la funcin Tokenizacin de Yytoken , utilice el tipo% directiva. % Tipo <nombre> Si los nombres por defecto no estn alterando el uso de estas directivas, la funcin de creacin de testigos se envoked con una llamada a Yylex.yylex () , que devuelve el Ytoken tipo.

Para evitar conflictos de alcance, nombres que comienzan con yy normalmente se reservan para funciones internas analizadores lxicos y variables.

2.2.10 defecto Token Tipo Para que el de 32 bits primitiva de tipo entero int , el tipo de cambio de la funcin Tokenizacin (y por lo tanto el tipo de token), use el nmero entero% directiva. % entero En la configuracin predeterminada, Yytokenes el tipo de retorno de la funcin Tokenizacin Yylex.yylex () , como en el siguiente fragmento de cdigo. clase yylex {... yylex Yytoken pblica () { ... } El nmero entero% directiva sustituye al cdigo anterior con una declaracin revisada, en la que el tipo de token se ha cambiado a int . clase yylex {... public int yylex ()

{ ... } Esta declaracin permite acciones lxicas para volver cdigos enteros, como en el siguiente fragmento de cdigo de una accin lxica hipottico. {... retorno 7; ... }

Las fuerzas de retorno de tipo entero cambia el comportamiento al final del archivo. En la configuracin predeterminada, los objetos - subclases de la clase java.lang.Object - son devueltos por Yylex.yylex () . Durante la ejecucin de la generada lxico yylex , un objeto de valor especial debe ser reservado para fin de archivo. Por lo tanto, cuando se alcanza el final del archivo para el archivo de entrada procesado (y de ah en adelante),Yylex.yylex () devuelve nulo . Cuando int es el tipo de retorno de Yylex.yylex () , nula ya no puede ser devuelta. En cambio, Yylex.yylex () devuelve el valor -1, que corresponde a un entero constante Yylex.YYEOF . El nmero entero% directiva implica % yyeof , vase ms adelante.

2.2.11 defecto Token Tipo II: Integer Envuelto Para hacer java.lang.Integer el tipo de retorno de la funcin Tokenizacin (y por lo tanto el tipo de token), utilice el intwrap% directiva. % intwrap Segn los ajustes predeterminados, Yytoken es el tipo de retorno de la funcin Tokenizacin Yylex.yylex () , como en el siguiente fragmento de cdigo. clase yylex {... yylex Yytoken pblica () { ... } El intwrap% directiva sustituye al cdigo anterior con una declaracin revisada, en la que el tipo de token se ha cambiado a

java.lang.Integer. clase yylex {... pblico java.lang.Integer yylex () { ... } Esta declaracin permite acciones lxicas para volver cdigos enteros envueltos, como en el siguiente fragmento de cdigo de una accin lxica hipottico. {... return new java.lang.Integer (0); ... }

Tenga en cuenta que el efecto de intwrap% directiva se puede lograr de forma equivalente mediante el tipo% directiva, de la siguiente manera. % Tipo java.lang.Integer Esto cambia manualmente el nombre del tipo de cambio de Yylex.yylex () para java.lang.Integer .

2.2.12 YYEOF el final de su archivo El % yyeof directiva hace que la constante entera Yylex.YYEOF sea declarado. Si el nmero entero% directiva est presente, Yylex.YYEOF se devuelve al final de su archivo. % yyeof Esta directiva hace Yylex.YYEOFser declarado de la siguiente manera: public final int YYEOF = -1, El nmero entero% directiva implica % yyeof .

2.2.13 Newlines y compatibilidad del sistema operativo En los sistemas operativos UNIX, la secuencia de cdigo de caracteres que representa un salto de lnea es el nico carcter `` \ n''. Por el contrario, en los sistemas operativos basados en DOS, la nueva lnea es la secuencia de dos caracteres `` \ r \ n'' que consiste en el retorno de carro seguido de la nueva lnea. Los % notunix resultados directiva, ya sea en el retorno de carro o salto de lnea est reconocida como una nueva lnea.notunix% Esta cuestin del reconocimiento de la secuencia correcta de caracteres como un carcter de nueva lnea es importante para garantizar la independencia de la plataforma Java.

2.2.14 Juegos de caracteres Los ajustes por defecto apoyan un alfabeto de cdigos de caracteres entre 0 y 127 inclusive. Si el analizador lxico generado recibe un cdigo de carcter de entrada que se encuentra fuera de estos lmites, el analizador lxico puede fallar. El pleno% directiva puede utilizarse para ampliar este alfabeto para incluir todos los valores de 8 bits. % completo Si el total% se da Directiva, JLex va a generar un analizador lxico que soporta un alfabeto de cdigos de caracteres entre 0 y 255 inclusive. El Unicode% . se puede utilizar para extender el alfabeto para incluir el alfabeto completo de Unicode de 16 bits % Unicode Si el Unicode% se da Directiva, JLex va a generar un analizador lxico que soporta un alfabeto de cdigos de caracteres entre 0 y 2 ^ 16 - 1, ambos inclusive. El % ignorecase directiva se puede dar para generar lexers maysculas y minsculas. % ignorecase Si el % ignorecase se da Directiva, COPA se ampliar a todas las clases de caracteres Unicode de una manera fcil para que coincida con las dos, y las letras del ttulo de maysculas, minsculas.

2.2.15 Formato de caracteres ay desde archivos Bajo el status quo, JLex y el analizador lxico que genera leer y escribir en archivos de texto ASCII, con caracteres de tamao byte. Sin embargo, para apoyar extensiones adicionales de la herramienta de JLex, todo el procesamiento interno de caracteres se realiza usando el tipo de carcter de Java de 16 bits, aunque no se admite la gama completa de valores de 16 bits.

2.2.16 Excepciones generadas por acciones lxicas El cdigo que figura en la parte de accin de las reglas de expresiones regulares, en la seccin tercera de la especificacin JLex, potencialmente puede producir una excepcin o propagarla desde otra funcin. Para declarar estas excepciones, utilice el % yylexthrow {... % Yylexthrow} directiva. % yylexthrow { <exception[1]> [ , <exception[2]>, ... ] % yylexthrow} El cdigo Java se especifica aqu se copiar en la declaracin del analizador lxico tokenizar funcin Yylex.yylex () , como sigue. pblica Yytoken yylex () throws <exception[1]> [ , <exception[2]>, ... ] { ... } Si el cdigo que figura en la parte de accin de las reglas de expresiones regulares lanza una excepcin que no est declarada utilizando el % yylexthrow {... % Yylexthrow} Directiva, el analizador lxico resultante no puede compilar correctamente.

2.2.17 Especificacin del valor devuelto al final de su archivoEl % eofval {... % Eofval} directiva especifica el valor de retorno de fin de archivo. Esta directiva permite al usuario escribir cdigo Java que desea copiar en el analizador lxico tokenizar funcin Yylex.yylex () para su ejecucin cuando se alcanza el final del archivo. Este cdigo debe devolver un valor compatible con el tipo de la funcin Tokenizacin Yylex.yylex () . % eofval { <cdigo> % eofval} El cdigo Java especificado en<cdigo> determina el valor de retorno de Yylex.yylex () cuando el extremo de fichero que se alcance para el archivo de entrada de la clase analizador lxico est procesando. Este tambin ser el valor devuelto porYylex.yylex () cada vez adicional esta funcin se llama una vez alcanzado un principio de fin de archivo, por lo <cdigo> puede ejecutarse ms de una vez. Por ltimo, el eofval% { y %} eofval directivas deben situarse al principio de una lnea.

Un ejemplo de uso es la siguiente. Supongamos que el valor de retorno deseado en fin-de-fichero es (nuevo token (sym.EOF)) en lugar del valor predeterminado nulo . El usuario agrega la siguiente declaracin en el archivo de especificacin. % eofval { return (nuevo token (sym.EOF)); }% eofval El cdigo se copia en Yylex.yylex () . en el lugar apropiado pblica Yytoken yylex () { ... return (nuevo token (sym.EOF)); ... } El valor devuelto por Yylex.yylex () al final del archivo y desde ese punto en adelante es ahora (nuevo token (sym.EOF)) .

2.2.18 Especificacin de una interfaz a implementar

JLex permite al usuario especificar una interfaz que el yylex implementar clase. Al aadir la siguiente declaracin en el archivo de entrada: % implementa <classname> el usuario especifica que yylex implementarnombre de clase . La declaracin de la clase analizador generado se ver as: yylex clase
implementa classname {...

2.2.19 Hacer que el pblico de clase generados El pblico% directiva hace que la clase analizador lxico generado por JLex a ser una clase pblica. pblica% El comportamiento por defecto no aade ningn especificador de acceso a la clase generada, lo que resulta en la clase siendo visible slo desde el paquete actual.

2.3 Reglas de expresiones regulares


La tercera parte de la especificacin JLex consiste en una serie de reglas para romper el flujo de entrada en tokens. Estas reglas especifican expresiones regulares, a continuacin, asociar estas expresiones con acciones consistentes en el cdigo fuente de Java. Las reglas tienen tres partes bien diferenciadas: la lista de opcionales del estado, la expresin regular, y la accin asociada. Este formato se representa de la siguiente manera. [ <estados> ] <expresin> <accin> {} Cada parte de la norma se discute en una seccin ms adelante. Si ms de una regla coincide con cuerdas de su entrada, el analizador lxico generado resuelve los conflictos entre normas por avidez la eleccin de la norma de que coincide con la cadena ms larga. Si ms de una regla coincide con las cadenas de la misma longitud, el analizador lxico elegir la regla que se da por

primera vez en la especificacin JLex. Por lo tanto, las normas que aparecen anteriormente en la memoria se dan una mayor prioridad por el analizador lxico generado. Las normas que figuran en una especificacin JLex deben coincidir con todas las entradas posibles. Si el analizador lxico generado recibe informacin que no coincide con ninguna de sus normas, se producir un error. Por lo tanto, toda la entrada debe ir acompaada de al menos una regla. Esto se puede garantizar mediante la colocacin de la siguiente regla en la parte inferior de una especificacin JLex: . {Java.lang.System.out.println ("entrada sin igual:" + yytext ());} (.) El punto, segn se describe a continuacin, coincidir con cualquier entrada a excepcin de la nueva lnea.

2.3.1 Estados lxicas Una lista del estado lxica opcional precede cada regla. Esta lista debe ser de la siguiente forma: < estado [0] [ , estatales [1], el estado [2], ... ] > El conjunto exterior de corchetes ([]) indican que varios estados son opcionales. El mayor que (<) y menor que (>) smbolos representan a s mismos y deben rodear la lista estatal anterior a la expresin regular. La lista estatal especifica en qu estados iniciales de la norma pueden ser emparejados. Por ejemplo, si yylex () se llama con el analizador lxico en el estado A , el analizador lxico intentar para que coincida con la entrada slo contra aquellas reglas que tienen una en su lista de estado. Si no se especifica ninguna lista de estado para una determinada norma, la regla se compara con en todos los estados lxicos.

2.3.2 Expresiones Regulares

Las expresiones regulares no deben contener ningn espacio en blanco, como espacios en blanco se interpreta como el fin de la expresin regular actual. Hay una excepcin: si (no nueva lnea) espacios en blanco aparecen dentro de las comillas dobles, se toman estos personajes para representarse a s mismos. Por ejemplo, ``'' se interpreta como un espacio en blanco. El alfabeto de JLex es el conjunto de caracteres ASCII, es decir, los cdigos de caracteres entre 0 y 127 inclusive. Los siguientes caracteres son meta-caracteres, con significados especiales en las expresiones regulares JLex.
? * + | () ^ $. [] {} "\

De lo contrario, los caracteres individuales representan a s mismos. ef expresiones regulares consecutivos representa la concatenacin. e | f La barra vertical (|) representa una opcin entre las expresiones regulares que lo rodean, por lo que coincide con una de las expresiones e o f . Las siguientes secuencias de escape son reconocidos y ampliados:
\B \N \T \F \R Retroceso nueva lnea Lengeta AvHoja Retorno de carro El cdigo de carcter correspondiente al nmero formado por tres dgitos \ ddd octales ddd El cdigo de carcter correspondiente al nmero formado por dos dgitos \ X dd hexadecimales dd \ El cdigo de carcter Unicode correspondiente al nmero formado por cuatro U dddd dgitos hexadecimales dddd . \^C Carcter de control \c Una barra invertida seguida de cualquier otro carcter c coincide consigo mismo

$ El smbolo de dlar ($) indica el final de una lnea. Si el signo de dlar termina con una expresin regular, la expresin se corresponde nicamente al final de una lnea.

. El punto (.) Coincide con cualquier carcter excepto el carcter de nueva lnea, por lo que esta expresin es equivalente a [^ \ n]. "..." Metacaracteres pierden su significado dentro de comillas dobles y representan a s mismos. La secuencia \ " (que representa el carcter nico " ) es la nica excepcin. {Name} Los corchetes indican una expansin de macro, con el nombre el nombre declarado de la macro asociada. * La estrella (*) representa el cierre y concuerda con cero o ms repeticiones de la expresin regular precedente Kleene. + El signo ms (+) coincide con una o ms repeticiones de la expresin regular precedente, por lo que e + es equivalente a ee *. ? El signo de interrogacin (?) Coincide con cero o una repeticin de la expresin regular anterior. (...) Los parntesis se utilizan para agrupar dentro de las expresiones regulares. [...] Backets cuadrados denotan una clase de caracteres y combinar con cualquier carcter incluido en los backets. Si el primer carcter despus del corchete de apertura ([) es la flecha arriba (^), el conjunto es negado y la expresin coincide con cualquier carcter excepto los encerrados en los backets. Diferentes reglas metacaracteres mantienen dentro de los backets, con las siguientes expresiones tienen un significado especial:
{Name} Expansin de Macro Rango de cdigos de caracteres de una a b que se incluirn en el conjunto de a-b caracteres Todos los metacaracteres dentro de comillas dobles pierden su significado "..." especial. La secuencia \ " (que representa el carcter nico " ) es la nica excepcin. \ Metacarcter siguiente barra invertida (\) pierde su significado especial

Por ejemplo, [az] coincide con cualquier letra minscula, [^ 0-9] coincide con cualquier cosa excepto un dgito, y [0-9a-fA-F] coincide con cualquier dgito hexadecimal. Dentro de los soportes de la clase de caracteres, un metacarcter tras una barra invertida pierde su significado especial. Por lo tanto, [\ - \ \] coincide con un guin o una barra invertida. Del mismo modo ["AZ"] coincide con uno de los tres personajes A, guin o Z. principio y final de guiones en una

clase de caracteres tambin pierden su significado especial, por lo que [+ -] y [+] hacer lo que se esperara que (es decir, un partido nico '+' y '-').

2.3.3 Acciones Asociadas La accin asociada con una regla lxica consiste en cdigo Java encerrado dentro del bloque-delimitando llaves. {accin} El cdigo Java accin se copia, como se indica, en el analizador lxico estado impulsada producida por JLex. Todas las llaves contenidas en la accin que no forman parte de cadenas o comentarios deben estar equilibrados.

2.3.3.1 Acciones y recursividad: Si no hay ningn valor de retorno se devuelve en una accin, el analizador lxico se loop, buscando para el prximo partido de la corriente de entrada y devuelve el valor asociado a ese partido. El analizador lxico se puede hacer que se repita de forma explcita con una llamada a yylex () , como en el siguiente fragmento de cdigo. {... yylex return (); ... } Este fragmento de cdigo hace que el analizador lxico que se repita, a buscar la siguiente coincidencia en la entrada y devuelve el valor asociado a ese partido. El mismo efecto puede tener, sin embargo, simplemente no volver de una accin determinada. Esto se traduce en el lxico buscando para el prximo partido, sin la carga adicional de la recursividad.

El fragmento de cdigo anterior es un ejemplo de recursin de cola, ya que la llamada recursiva se produce al final de la ejecucin de la funcin de llamada. El fragmento de cdigo siguiente es un ejemplo de una llamada recursiva que no es la cola recursiva. {... next = yylex (); ... } acciones recursivas que no son obra de cola recursiva de la forma esperada, salvo que las variables como yyline y yychar pueden cambiar durante la recursividad.

2.3.3.2 Transiciones de estado: Si los estados lxicos se declaran en la seccin de directivas JLex, transiciones en estos estados pueden declarar dentro de las acciones de expresiones regulares. Las transiciones de estado son hechas por la siguiente llamada de funcin. yybegin (estado); La funcin void yybegin () se pasa el nombre del estado del estado y los efectos de la transicin a este estado lxico. El estado del Estado debe ser declarado dentro de la seccin de directivas JLex o esta convocatoria dar lugar a un error del compilador en el archivo fuente generado. La nica excepcin a esta obligacin de declaracin es el estado YYINITIAL , el estado lxica implcitamente declarada por JLex. El analizador lxico generado que comience el anlisis lxico en estado YYINITIAL y permanece en este estado hasta que se realice una transicin.

2.3.3.3 Valores lxicos disponibles: Los siguientes valores internos de la yylex clases, estn disponibles en la parte de accin de las reglas lxicas.
Variable o mtodo ActivationDirective Descripcin yytext Parte coincidente de la corriente de entrada de Siempre activa. java.lang.String (); caracteres. ndice del carcter de base cero del primer int yychar; % Caracteres carcter en la parte coincidente de la corriente de entrada Nmero de lnea de base cero del comienzo de la int yyline; Lnea% porcin de emparejado de la corriente de entrada

3. Analizadores lxicos generados


JLex tendr una especificacin adecuadamente formado y transformarlo en un archivo de cdigo fuente de Java para el analizador lxico correspondiente. El analayzer lxico generado reside en la clase yylex . Hay dos constructores a esta clase, tanto requieran un nico argumento: el flujo de entrada a tokenizados. La corriente de entrada puede ser del tipojava.io.InputStream o java.io.Reader (como StringReader ). Tenga en cuenta que la java.io.Reader constructor se debe utilizar si se genera un analizador lxico aceptar caracteres Unicode, como el JDK 1.0 java.io.InputStream clase no siempre leer unicode correctamente. La funcin de acceso al lxico es Yylex.yylex () , que devuelve el siguiente token de la corriente de entrada. El tipo de retorno es Yytoken y la funcin se declara de la siguiente manera. clase yylex {... pblico Yytoken yylex () { ... } El usuario debe declarar el tipo de Yytoken y puede lograr esto convenientemente en la primera seccin de la especificacin JLex, la seccin de cdigo de usuario. Por ejemplo, para hacer Yylex.yylex ()devuelve una envoltura alrededor de los nmeros enteros, el usuario introduzca el siguiente cdigo en algn lugar antes de la primera ``%%''. clase Yytoken {int campo; Yytoken (int f) {campo = f; }} Luego, en las acciones lxicas, seran devueltos enteros envueltos en algo as como as. ... { return new Yytoken (0); ... } Del mismo modo, en la seccin de cdigo de usuario, una clase puede definirse declarar constantes que se corresponden con cada uno de los tipos de tokens. clase TokenCodes {... public String static final = 0; pblica INTEGER static final = 1; ... } A continuacin, en las acciones lxicas, estos cdigos simblicos podran ser devueltos. {... return new Yytoken (STRING); ... } Estos son ejemplos simplificados; en el uso real, uno probablemente definir una clase de testigo que contiene ms informacin que un cdigo de nmero entero.

Estos ejemplos comienzan a ilustrar las tcnicas orientadas a objetos que un usuario puede emplear para definir un tipo de token arbitrariamente complejas para ser devuelto por Yylex.yylex () . En particular, la herencia permite al usuario subir ms de un tipo de token. Si se necesitaba un tipo de token distinto para cadenas y enteros, el usuario puede hacer las siguientes declaraciones. clase Yytoken {... } clase IntegerToken extiende Yytoken {... } clase StringToken extiende Yytoken {... } A continuacin, el usuario puede volver tanto IntegerToken y StringToken tipos de las acciones lxicas.

Los nombres de la clase analizador lxico, la funcin tokening, y el tipo que devuelve cada uno pueden ser modificados mediante las directivas JLex. Consulte la seccin 2.2.9 para ms detalles.

4. Rendimiento
Se realiz un experimento de referencia, comparar el rendimiento de un analizador lxico generado por JLex a la de un analizador lxico escrito a mano. La comparacin se hizo para los analizadores lxicos de una simple `` juguete'' lenguaje de programacin. El analizador lxico escrito a mano, al igual que el analizador lxico generado por JLex, fue escrito en Java.

El experimento consiste en ejecutar cada analizador lxico en dos archivos de cdigo fuente escrito en el lenguaje de juguete, a continuacin, midiendo el tiempo requerido para procesar estos archivos. Cada analizador lxico se invoc por un conductor ficticio tambin escrito en Java. El analizador lxico generado result ser bastante rpida, como los siguientes resultados muestran.
Tamao del archivo de origen 177 lneas 897 lneas JLex-Generado analizador lxico: Tiempo de ejecucin 0,42 segundos 0,98 segundos Manuscrita analizador lxico: Tiempos de ejecucin 0,53 segundos 1,28 segundos

El analizador lxico JLex profundamente super al lxico manuscrita. Una de las mayores quejas acerca de los analizadores lxicos por tablas generadas por programas como JLex es que estos analizadores lxicos no se desempean tan bien como los escritos a mano. Por lo tanto, este experimento es particularmente importante para demostrar la velocidad relativa de analizadores lxicos JLex.

5. Cuestiones de aplicacin

5.1 Funciones no implementadas


La siguiente es una lista (posiblemente incompleta) de caractersticas no implementadas de JLex.

1. La expresin de operador lookahead regulares no est implementada, y no se incluye en la lista de los metacaracteres de expresiones regulares especiales. 2. El operador de comienzo de lnea (^) asume el siguiente comportamiento no estndar. Un partido en una expresin regular que utiliza este operador har que la nueva lnea que precede al partido para ser desechados.

Unicode 5.2 vs Ascii


En contraste con el tipo de carcter de 8 bits (char) el mandato de Ansi C, Java soporta 16-bit de caracteres y el conjunto de caracteres Unicode. Java proporciona una clase String integrada para manipular estos caracteres Unicode. Desde la versin 1.2.5, JLex utiliza los JDK 1.1 Lector y Escritor clases para leer en el archivo de especificacin JLex y escribir el archivo de origen analizador lxico. Esto significa que todos los caracteres Unicode se permite la entrada tanto de estos. Para que el analizador generado para trabajar con caracteres Unicode, debe utilizar el java.io.Reader constructor del analizador generado, y el lector que usted proporciona debe manejar adecuadamente la traduccin desde el formato nativo de OS-unicode. Tambin debe especificar el unicode% directiva en la especificacin, vase la seccin 2.2.14 .

5.3 Las comas en las listas estatales


Las comas entre los nombres de estado en las listas de la declaracin y las reglas lxicas son opcionales. Estas listas se analizan correctamente con el espacio blanco entre los nombres de los estados y sin separadores de coma.

5.4 Wish Lista de caractersticas no implementadas


Las siguientes caractersticas de menor importancia sera bueno tener como parte de JLex, pero no se han aplicado debido a su alcance y su impacto negativo en el rendimiento. 1. La deteccin de los apoyos desequilibrio dentro de la parte de comentarios de acciones lxicas. 2. Deteccin de ciclos en definiciones de macros.

6. Crditos y derechos de autor

6.1 Crditos
El tratamiento de los generadores de analizadores lxicos dados en Alan Holub diseo del compilador en C (Prentice-Hall, 1990) proporciona un punto de partida para mi aplicacin. Las discusiones con el profesor Andrew Appel del Departamento de Informtica de la Universidad de Princeton proporcionan orientacin en el diseo de JLex. Java es una marca comercial de Sun Microsystems Incorporated.

6.2 Derechos de autor


JLex AVISO DE COPYRIGHT, DE LICENCIA Y RENUNCIA. Derechos reservados 1996 por Elliot Joel Berk. El permiso para usar, copiar, modificar y distribuir este software y su documentacin con cualquier propsito y sin cargo se concede, siempre que el aviso de copyright anterior aparezca en todas las copias y que tanto el aviso de copyright y este aviso de permiso y un repudio de garanta aparecen en documentacin de apoyo, y que el nombre de Elliot Joel Berk no se pueden utilizar en la publicidad o propaganda relativa a la distribucin del software sin previo permiso especfico por escrito. Elliot Joel Berk renuncia a cualquier garanta con respecto a este software, incluyendo todas las garantas implcitas de comerciabilidad y adecuacin. En ningn caso Elliot Joel Berk ser responsable por daos especiales, indirectos o consecuentes o cualquier dao que resulte de la prdida de uso, datos o beneficios, ya sea en accin de contrato, negligencia u otra accin ilcita, que surja de o en conexin con el uso o rendimiento de este software. Frank Flannery Mi 24 de julio 1996 00:27:39 EDT

You might also like