You are on page 1of 7

PONTIFICIA UNIVERSIDAD CATÓLICA DEL

ECUADOR SEDE ESMERALDAS

JFLEX

Adame Bernal Ayrton Fabián, Cedeño Cedeño Karol Ivette, Palacios


Cornejo Piero José

“JFlex + documentación” desde la página de


Resumen.- El siguiente artículo trata sobre cómo si se tiene por descargas de JFlex.
un lado un generador de analizadores léxicos (JFlex) y por otro lado
un generador de analizadores sintácticos (CUP), se pueden integrar
cada uno de los procesos de dichos metacompiladores para de esta
forma obtener un compilador mucho más completo y personalizado,
esto ahorra de manera abismal la generación de código al momento
de programar un compilador.

Palabras claves.-lenguaje, metacompiladores, jflex, analizador,


compilador, programa.

I. INTRODUCCION Extraer el contenido una vez descargado el archivo


Un analizador léxico es un programa que busca en, zip, se extraerá el contenido hacia una carpeta que
generalmente, grandes ficheros de texto, aquellas será tomada como directorio de instalación. Por
cadenas que se corresponden con unos patrones defecto se usará la ruta c:\jflex. El contenido
especificados en el analizador. extraído del archivo zip deberá ser similar al
siguiente:
Flex es una tecnología desarrollada para la creación
de Aplicaciones Enriquecidas de Internet (RIA’s).
FLEX es un analizador léxico bajo licencia GPL.
Cada vez que se encuentre uno de los patrones
especificados en FLEX se puede ejecutar un
conjunto de acciones asociadas. FLEX es el
analizador de dominio público compatible con el
analizador léxico más frecuentemente utilizado: LEX
(bajo sistema UNIX). FLEX (y LEX) genera, dada
una especificación correcta de patrones y acciones,
un programa en lenguaje C que puede ser compilado
para obtener un programa ejecutable.
II. CONTENIDO

2.1. Lenguaje JFlex


Para la instalación de JFlex, se descargará el
archivo zip correspondiente a la última versión de
Dentro de la carpeta bin del directorio de instalación Una vez seleccionada, se da Clic en el botón
de JFlex, se ubicará el archivo jflex.bat. Editar…, el cual mostrará un nuevo diálogo en
donde al final del contenido del campo Valor de la
variable, se agregará la ruta hacia el directorio bin
de JFlex.
Para separar las rutas unas de otras, se debe de
utilizar el símbolo de punto y coma “;“.

Se debe de abrir el archivo jflex.bat en un editor de


texto como Notepad++ o Sublime Text.
Dentro del archivo, hay que editar la ruta que se está
asignando a la variable JFLEX_HOME con la ruta
en donde se instaló JFlex (No es necesario si la ruta
de instalación es c:\jflex).
Una vez agregada la ruta al final de la variable
Path, se dará Clic en la opción Aceptar de todos los
diálogos que se han abierto para editar la variable.
Comprobar la Instalación para verificar que se
haya instalado y configurado correctamente JFlex,
se procede a ejecutar el siguiente comando en la
Como nota, no se debe de agregar una diagonal ventana de comando.
invertida al final de la ruta que se define en
JFLEX_HOME.
Al terminar la edición, será necesario guardar los
cambios. Si todo se encuentra en orden, al ejecutar el
comando, se mostrará un mensaje indicando la
Configurar Variables de Entorno dentro de la
versión que se descargó desde el sitio de JFlex.
ventana de Variables de entorno, dirigirse a la
sección de Variables del sistema y ubicar la variable
Path.

Con todo esto ya tendremos instalado y configurado


el JFlex en nuestro ordenador. (Búcaro, 2015)
2.2. Creación de un analizador léxico en JFlex patrón, sencillamente le visualiza por la salida
estándar y continua a reconocer el siguiente lexema.
Los pasos para crear un analizador léxico con esta
herramienta son: Para no tener que introducir la cadena fuente por
teclado, sino que sea reconocida desde un fichero,
 Construir un fichero de texto en lenguaje Lex podemos, o bien redirigir la entrada con:
que contiene la estructura abstracta del
analizador.
 Metacompilar el fichero anterior con PCLex.
Donde:
Así se obtendrá un fichero fuente en C
estándar. Algunas veces hay que efectuar
modificaciones discretas en este código,
aunque las últimas versiones de PCLex han
disminuido al máximo estas situaciones. O bien hacer uso de las variables yycin c yyout de
 Compilar el fuente en C generado por PCLex tipo *FILE para inicializarlas a los ficheros
con un compilador C, con lo que correspondientes. Estas variables son suministradas
obtendremos un ejecutable que sigue los por el código generado por PCLex, e inicialmente
pasos descritos, si ejecutamos el prog.exe la apuntan a stdin y stdout respectivamente. (Sergio &
aplicación se quedará esperando a que se le Miguel, 2005)
introduzca la cadena de entrada por teclado 2.3. Definiciones, reglas y funciones.
para proceder a su partición en lexemas; el
fin de fichero se introduce pulsando las teclas El fichero de entrada de flex está compuesto de tres
Ctrl y Z (en pantalla aparece ^Z). Así el secciones, separadas por una línea donde aparece
programa parte de la cadena de entrada en únicamente un `%%' en esta:
los lexemas más largos posible, y para cada
una de ellos ejecuta la acción asociada al
patrón por el que encaje. Por ejemplo , si el
fuente en Lex es de la forma:

La sección de definiciones contiene declaraciones de


definiciones de nombres sencillas para simplificar la
Y tecleamos: especificación del escáner, y declaraciones de
condiciones de arranque, que se explicarán en una
sección posterior. Las definiciones de nombre tienen
Cuando un lexema casa con un patrón, yylex() cede la forma:
el control a su acción. De esta forma se obtiene por
pantalla lo siguiente:
El "nombre" es una palabra que comienza con una
letra o un subrayado (`_') seguido por cero o más
La palabra “HOLA” encaja por el segundo patrón y letras, dígitos, `_', o `-' (guión). La definición se
la palabra “23” encaja por el primero. Nótese que considera que comienza en el primer caracter que no
no hemos especificada ningún patrón sobre los sea un espacio en blanco siguiendo al nombre y
espacios en blanco; por defecto, la función yylex() continuando hasta el final de la línea. Posteriormente
generada cuando se encuentra un carácter o se puede hacer referencia a la definición utilizando
secuencia de caracteres que no se casa con ningún
"{nombre}", que se expandirá a "(definición)". Por declaraciones) al código que debe ejecutarse siempre
ejemplo: que se entra a la rutina de análisis. Cualquier otro
texto sangrado o %{} en la sección de reglas sigue
copiándose a la salida, pero su significado no está
bien definido y bien podría causar errores en tiempo
Define "DIGITO" como una expresión regular que de compilación (esta propiedad se presenta para
empareja un dígito sencillo, e "ID" como una conformidad con POSIX; para otras características
expresión regular que empareja una letra seguida similares) see section Incompatibilidades con lex y
por cero o más letras o dígitos. Una referencia POSIX)
posterior a En la sección de definiciones (pero no en la sección
de reglas), un comentario sin sangría (es decir, una
línea comenzando con "/*") también se copia
Es idéntica a literalmente a la salida hasta el próximo "*/".
(Paxson, 1995)
2.4. Especificaciones Léxicas
Y empareja uno o más dígitos seguido por un `.'
Expresiones regulares: Notación o representación
seguido por cero o más dígitos. La sección de reglas
para especificar patrones para un componente léxico.
en la entrada de JFlex contiene una serie de reglas de
Cada patrón concuerda con una serie de cadenas, de
la forma:
modo que las expresiones regulares servirán como
nombres para conjuntos de cadenas.

Donde el patrón debe estar sin sangrar y la acción Cadenas y lenguajes: Alfabeto o clase de carácter:
debe comenzar en la misma línea. Denota cualquier conjunto finito de símbolos (letras
o caracteres).
See section Acciones, para una descripción más
amplia sobre patrones y acciones. Conjunto {0,1} alfabeto binario a, b, c, d, e,..., z
alfabeto
Finalmente, la sección de código de usuario
simplemente se copia a `lex.yy.c' literalmente. Esta Código ASCII, EBCDIC alfabetos del computador
sección se utiliza para rutinas de complemento que Cadena (frase o palabra): Es una secuencia finita de
llaman al escáner o son llamadas por este. La símbolos tomadas de un alfabeto.
presencia de esta sección es opcional; Si se omite, el
segundo `%%' en el fichero de entrada se podría Lenguaje: Se refiere a cualquier conjunto de cadenas
omitir también. de un alfabeto fijo.

En las secciones de definiciones y reglas, cualquier También se puede extender el operador de


texto sangrado o encerrado entre `%{' y `%}' se copia “exponenciación” a los lenguajes definiendo L°
íntegramente a la salida (sin los %{}'s). Los %{}'s como { }.
deben aparecer sin sangrar en líneas ocupadas
Sea L el conjunto {A, B, C, D,..., Z, a, b, c, d… z} y
únicamente por estos.
D el conjunto {0, 1, 2,..., 9}. Algunos ejemplos de
En la sección de reglas, cualquier texto o %{} nuevos lenguajes creados a partir de L y D:
sangrado que aparezca antes de la primera regla
1. LUD es el conjunto de letras y dígitos.
podría utilizarse para declarar variables que son 2. LD es el conjunto de cadenas que consta de
locales a la rutina de análisis y (después de las una letra seguida de un dígito.
3. L4 es el conjunto de todas las cadenas de Cuidado con:
cuatro letras.
4. L* es el conjunto de todas las cadenas de  Comentarios de C
letras, incluyendo la cadena vacía ().  Caracteres especiales: *? % [ etc
5. L(LUD)* es el conjunto de todas las cadenas  Espacios en blanco y tabuladores a principio
de letras y dígitos que comienzan con una de línea. (Portolés)
letra.
6. D+ es el conjunto de todas las cadenas de uno 2.6. Opciones
o más dígitos. Las opciones más interesantes se pueden clasificar en
opciones de clase, de la función de análisis, de fin de
Las expresiones regulares se utilizan para describir
fichero, de juego de caracteres y de contadores.
los componentes léxicos de un lenguaje o tokens. Las
Todas ellas empiezan por el carácter % y no pueden
expresiones regulares utilizan varios tipos de
estar precedidas por nada en la línea en que aparecen.
operadores para definir los componentes léxicos:
(Gálves, 2011)
 Paréntesis. Para agrupar símbolos
2.6.1. Opciones de clase
 Operación concatenación. Se permite la
concatenación de cadenas. Las opciones de clase más útiles son:
 Operación alternativa. Se representa por |,
y permite la elección entre dos o más  %class nombreClase. Por defecto, la clase
alternativas. que genera JFlex y que implementa el
analizador lexicográfico se llama Yylex y se
Componentes léxicos: escribe, por tanto, en un fichero Yylex.java.
Utilizando esta opción puede cambiarse el
a) Identificador: (Letra seguida de letras y
nombre de dicha clase.
dígitos). Se puede definir a partir de dos
símbolos: letra y dígito. letra (letra|dígito) *  %implements interface1, interface2, etc.
b) Constante entera: (sin signo) digito+(con Genera una clase (por defecto Yylex) que
signo) (+|-) digito+ implementa las interfaces indicadas. El
c) Constante de punto flotante sin exponente: programador deberá introducir los métodos
(+|) digito+.digito+ necesarios para hacer efectiva dicha
implementación.
Abreviaturas en la notación  %extends nombreClase. Genera una clase
1. Uno o más casos de. + que hereda de la clase indicada.
2. Cero o un caso.?  %public. Genera una clase pública. La clase
Conjuntos no regulares: Aquellos lenguajes que no
generada por defecto no posee modificar de
se pueden describir con ninguna expresión regular.
ámbito de visibilidad.
(Blog Compiladores de Séptimo, 2010)
 %final. Genera una clase final, de la que
2.5. Expresiones Regulares (Patrones) nadie podrá heredar.
 %abstract. Genera una clase abstracta de la
En la definición de patrones:
que no se pueden crear objetos.
– Usar [] para conjuntos de caracteres  %{ bloqueJava %}.El programador también
– Usar () para agrupar. puede incluir sus propias declaraciones y
métodos en el interior de la clase Yylex
• Por ejemplo, es típico que vayan seguidos de *
escribiendo éstas entre los símbolos %{ y %}.
– Usar {} para utilizar los “bautizos” de la  %init{ códigoJava %init}. Es posible incluir
primera sección código en el constructor generado
automáticamente por JFlex para la clase 2.7.2. Opciones de juego de caracteres
Yylex mediante el uso de esta. (Gálves, 2011)
Estas opciones permiten especificar el juego de
2.6.2. Opciones de la función de análisis caracteres en el que estará codificada la entrada al
analizador lexicográfico generado por JFlex. Las
Estas opciones permiten modificar el método o
posibilidades son:
función encargada de realizar el análisis
lexicográfico en sí. Las opciones más útiles son:  %7bit. Es la opción por defecto, y asume que
cada carácter de la entrada está formado por
 %function nombreFuncionAnalizadora. Por
un único byte cuyo bit más significativo es 0,
defecto, la función que arranca el análisis se
lo que da 128 caracteres.
llama yylex() y devuelve un valor de tipo
 %8bit. Asume que cada carácter está formado
Yytoken. Esta opción permite cambiar de
por un byte completo, lo que da 256
nombre a la función yylex().
caracteres.
 %int. Hace que la función yylex() devuelva
 %unicode. Asume que la entrada estará
valores de tipo int en lugar de Yytoken.
formada por caracteres Unicode. Esto no
 %intwrap. Hace que la función yylex()
quiere decir que se tomen dos bytes de la
devuelva valores de tipo Integer en lugar de
entrada por cada carácter sino que la
Yytoken.
recuperación de caracteres se deja recaer en
 %type nombreTipo. Hace que la función la plataforma sobre la que se ejecuta yylex().
yylex() devuelva valores del tipo
 %ignorecase. Hace que yylex() ignore entre
especificado (ya sea primitivo o no) en lugar
mayúsculas y minúsculas mediante el uso de
de Yytoken.
los métodos toUpperCase y toLowerCase de
 En cualquier caso, JFlex no crea la clase
la clase Character. Resulta evidente que las
Yytoken, sino que debe ser suministrada de tres primeras opciones son mutuamente
forma externa, o bien especificada en el área excluyentes.
de código. (Gálves, 2011)
2.8. Opciones de Contadores
2.7. Opciones de fin de ficheros, opciones de
juegos de caracteres. Estas opciones hacen que el analizador lexicográfico
almacene en contadores el número de caracteres,
2.7.1 Opciones de fin de fichero
líneas o columnas en la que comienza el lexema
Por defecto, cuando yylex() se encuentra el carácter actual. La nomenclatura es:
fin de fichero, retorna un valor null. En caso de que
 %char. Almacena en la variable yychar el
se haya especificado %int en las opciones anteriores,
número de caracteres que hay entre el
se retornará el valor YYEOF definido como public
comienzo del canal de entrada y el comienzo
static final en la clase Yylex. Para cambiar este
del lexema actual.
comportamiento, las opciones de fin de fichero más
 %line. Almacena en la variable yyline el
útiles son:
número de línea en que comienza el lexema
 %eofclose. Hace que yylex() cierre el canal actual.
de lectura en cuanto se encuentre el EOF.  %column. almacena en la variable yycolumn
 %eofval{ códigoJava %eofval}. Es posible el número de columna en que comienza el
ejecutar un bloque de código cuando yylex() lexema actual. Todos los contadores se
se encuentre el EOF. Para ello se utilizará inician en 0.
esta opción.
2.9. Funciones y variables de JFlex IV. CONCLUSIONES

 Los compiladores para lenguajes de alto nivel


Ya hemos visto dos de las funciones más importantes tienen muchas fases, en las que
generadas por JFlex y que pueden ser utilizadas por progresivamente se va transformando un
el programador en el interior de las acciones léxicas. texto de un lenguaje a otro.
Se trata de funciones y variables miembro, por lo
 Muchas aplicaciones necesitan lenguajes
que, si son utilizadas fuera de las acciones léxicas
especiales y, por tanto, compiladores. Estos
deberá indicarse el objeto contextual al que se
compiladores sencillos se pueden construir
aplican (p.ej. miAnalizador.yylex()). Aquí las
con herramientas para análisis léxico y
recordamos y las extendemos:
sintáctico como flex.
 Yylex(Reader r): es el constructor del
V. REFERENCIAS
analizador léxico. Toma como parámetro el
Blog Compiladores de Séptimo. (20 de Noviembre de 2010).
canal de entrada del cual se leerán los Compiladores. Obtenido de
caracteres. http://bloggcompliladores7mo1.blogspot.com/2010/1
 Yytoken yylex(): función principal que 1/unidad-2_20.html#tema4
Búcaro, J. (11 de Abril de 2015). jonathanbucaro. Obtenido
implementa el analizador léxico. Toma la de
entrada del parámetro especificado en la https://jonathanbucaro.com/2015/04/11/instalacion-
llamada al constructor de Yylex. (Gálves, jflex/
2011) Gálves, R. S. (2011). Java a Tope: Traductores y
Compiladores con Lex/yacc, jflex/cup y javacc.
Obtenido de
3. Ejemplo de Flex https://ocw.uma.es/ingenierias/traductores-
compiladores-e-interpretes/material-de-clase-
1/Capitulo_2.pdf
Paxson, V. (Abril de 1995). Obtenido de
http://es.tldp.org/Manuales-LuCAS/FLEX/flex-es-
2.5.html
Portolés, D. (s.f.). Seminario de Introducción a Flex. Obtenido
de
http://webdiis.unizar.es/~ezpeleta/lib/exe/fetch.php?
media=misdatos:compi:2bisbisseminarioflex.pdf
Ramos, G. (s.f.). academia.edu. Obtenido de
http://www.academia.edu/8438309/JFLEX
Sergio, G., & Miguel, M. (2005). Obtenido de
https://app.box.com/s/zcqrj3c0o310u2a3sqh6dhtgwu
qoxfvb

You might also like