JLEX
Enviado por taesmi • 12 de Julio de 2016 • Ensayo • 1.410 Palabras (6 Páginas) • 223 Visitas
JLex
Lex es un generador de analizador léxico para el sistema operativo UNIX, orientado al lenguaje de programación C. Lex toma un archivo de especificación de formato especial que contiene los detalles de un analizador léxico. Esta herramienta crea un archivo de código fuente C para el analizador léxico tabla impulsada asociado.
La utilidad JLex se basa en el modelo de generador de analizador léxico Lex. JLex toma un archivo de especificación similar al aceptado por Lex, a continuación, crea un archivo de código fuente de Java para el analizador léxico correspondiente.
JLex fue desarrollado por Elliot Berk en la Universidad de Princeton. Ahora es mantenido por C. Scott, Ananian .
2. JLex Especificaciones
Un archivo de entrada JLex está organizado en tres secciones, separados por las directivas de dos por ciento (`` %% ''). Una especificación adecuada JLex tiene el siguiente formato. código de usuario %%directivas JLex %% expresión regular gobierna El `` %% '' directivas distinguen las secciones del archivo de entrada y se deben colocar en el comienzo de su línea. El resto de la línea que contiene el `` %% '' directivas pueden ser descartados y no deben ser utilizados para albergar declaraciones o código adicionales.
La sección de código de usuario - la primera sección del archivo de especificación - se copia directamente en el archivo de salida resultante. Esta zona de la especificación ofrece un espacio para la implementación de clases de utilidad o tipos de retorno.
La sección de directivas JLex es la segunda parte del archivo de entrada. Aquí, las definiciones de macros se dan nombres y estatales se declaran.
La tercera sección contiene las reglas de análisis léxico, cada uno de los cuales consta de tres partes: una lista opcional de estado, una expresión regular, y una acción.
3. Los analizadores léxicos generados
JLex tendrá una especificación adecuadamente formado y transformarlo en un archivo de código fuente de Java para el analizador léxico correspondiente.
El analayzer léxico generado reside en la clase yylex . Hay dos constructores a esta clase, que requiere tanto un solo argumento: la corriente de entrada a ser de testigos. La corriente de entrada puede ser cualquiera de tipo java.io.InputStream o java.io.Reader (como StringReader ). Tenga en cuenta que la java.io.Reader constructor debe utilizar si va a generar un analizador léxico aceptar caracteres Unicode, como el JDK 1.0 java.io.InputStream clase no siempre leer Unicode correctamente.
La función de acceso al léxico es Yylex.yylex () , que devuelve el siguiente token de la corriente de entrada. El tipo de retorno es Yytoken y la función se declara de la siguiente manera. yylex clase {... yylex Yytoken público () { ...} El usuario debe declarar el tipo de Yytoken y puede lograr esto convenientemente en la primera sección de la especificación JLex , la sección de código de usuario. Por ejemplo, para hacer Yylex.yylex () devolverá una envoltura alrededor de los números enteros, el usuario introduzca el siguiente código en alguna parte que precede a la primera `` %% ''. clase Yytoken {int campo; Yytoken (int f) = f {campo; }} A continuación, en las acciones léxicas, enteros envueltos serían devueltos, en algo así como de esta manera. {... volver nueva Yytoken (0); } ... Del mismo modo, en la sección de código de usuario, una clase puede ser definida declarar constantes que se corresponden con cada uno de los tipos de tokens. códigos de token de clase {... public String estática final = 0; INTEGER public static final = 1; ...} Luego, en las acciones léxicas, estos códigos simbólicos podrían ser devueltos. {. .. volver nueva Yytoken (CADENA); } ... Estos son ejemplos simplificados; en el uso real, uno probablemente definir una clase de testigo que contiene más información que un código de número entero. Estos ejemplos comienzan a ilustrar las técnicas orientadas a objetos a un usuario podría emplear para definir un tipo de token arbitrariamente complejo para ser devueltos por Yylex.yylex () .
Los nombres de la clase de análisis léxico, la función tokening, y su tipo de retorno cada uno pueden alterarse usando las directivas JLex.
4. Rendimiento
Se realizó un experimento de referencia, comparar el rendimiento de un analizador léxico generado por JLex a la de un analizador léxico escrito a mano. La comparación se hizo para los analizadores léxicos de un lenguaje de programación sencillo `` juguete ''. El analizador léxico escrito a mano, al igual que el analizador léxico generado por JLex, fue escrito en Java.
El experimento consiste en ejecutar cada analizador léxico en dos archivos de código fuente escrito en el lenguaje de juguete, a continuación, midiendo el tiempo requerido para procesar estos archivos. Cada analizador léxico se invocó por un conductor maniquí también escrito en Java.
El analizador léxico generado resultó ser bastante rápida, como los siguientes resultados muestran.
Tamaño del archivo de origen | JLex-Generated analizador léxico: Tiempo de ejecución | Escrito a mano Analizador Léxico: Tiempos de ejecución |
177 líneas | 0,42 segundos | 0,53 segundos |
897 líneas | 0,98 segundos | 1,28 segundos |
El analizador léxico JLex profundamente superó al analizador léxico escrito a mano.
...