Logo Studenta

Actividad 7 - Daniel Cuellar (1)

¡Este material tiene más páginas!

Vista previa del material en texto

UNACAR
Universidad Autónoma del Carmen
“Por la Grandeza de México”
Facultad de Ciencias de la Información
MATERIA
LENGUAJES FORMALES Y AUTOMATAS
TEMA
LAS DISTINTAS HERRAMIENTAS PARA ANÁLISIS LÉXICO
NOMBRE
DANIEL VALDEMAR CUELLAR VALLES
MATRICULA
160623
Ciudad del Carmen, Campeche A 9 marzo del 2022
Índice
Introducción	3
Lex	4
Flex	6
JLex	8
JFlex	10
Tablas comparativas	12
Conclusión	14
Referencias bibliográficas	15
Introducción
En este trabajo se expondrán las distintas herramientas para el análisis léxico que se lograron encontrar después de una extensa investigación, la cual resultó muy reveladora pues como dijeron (Pedro Bavera & Martín Nordio, 2003) “El analizador léxico forma parte de la primera fase de un compilador. Un compilador es un programa que lee un programa escrito en un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objetó.” esto quiere decir que sin un analizador léxico no sería posible compilar cualquier programa realizado en algún lenguaje de programación por ende las herramientas de software para el análisis léxico resultan ser muy útiles ya que facilitan la tarea de crear compiladores e intérpretes, así como autómatas destinados a diferentes propósitos ya sean en la industria o para tareas simples, y de no existir estas herramientas los analizadores léxicos deberían crearse a mano resultando en un proceso tedioso. En el desarrollo del trabajo se hablará a profundidad sobre las características que ofrecen estas herramientas, ventajas y desventajas respectivamente, sin embargo, no se podrán abarcar todas las herramientas del mercado solo las más relevantes actualmente.
Lex
De acuerdo con sus autores (Mike & Schmidt, 1975) “Lex es un generador de programas diseñado para el procesamiento léxico de flujos de entrada de caracteres.” Es el pionero en su área ya que la mayoría de las herramientas para el análisis léxico se basan en él, genera código C a partir de una serie de reglas escritas en su propio lenguaje, funciona en sistemas Windows, UNIX, Linux y cualquier distribución de Ubuntu, existen dos opciones de instalación, descargando los archivos e instalando su respectivo ejecutable desde su página oficial[footnoteRef:1] o en el sistema operativo que lo permita; se puede apreciar una “f” antes de ”lex” esto es porque “flex” es una reescritura de “lex” lo puede comprobar cualquier persona, instalando y corriendo un programa con las reglas de “lex” funcionara perfectamente, el único detalle sería colocar la herramienta a usar al inicio de la sentencia para generar el archivo “lex.yy.c” el cual sirve para producir el ejecutable del programa, esto es muy parecido a lo que pasa con “C” y “C++” el más actual puede interpretar la sintaxis del más antiguo y así solo tener un programa para generar código en ambos lenguajes, en resumen los únicos requisitos para poder instalar “Lex” es descargar el ejecutable, instalarlo y poner en marcha un programa. La estructura del código “Lex” de acuerdo con el manual elaborado por (Mike & Schmidt, 1975): [1: (Paxson, Flex for Windows, 2001)] 
{definiciones}
%%
{normas}
%%
{subrutinas de usuario}
“Donde las definiciones y las subrutinas de usuario a menudo se omiten. El segundo %% es opcional, pero el primero es obligatorio para marcar el comienzo de las reglas.” 
Como se verá a lo largo de este documento muchas herramientas utilizan esta misma estructura para dividir el código, ahora bien, este analizador léxico fue la base para crear las distintas herramientas que se usan hoy en día ya que es muy cómoda, eficiente y practica para poder desarrollar, relacionado a esto no se necesita la integración de algún otro analizador para cumplir su cometido, sin embargo, los principales contras de esta herramienta serian su antigüedad y su sintaxis al elaborar las expresiones, pues resulta algo tedioso seguir la estructura del código tal cual como está pensada, pero esto es normal ya que la herramienta fue creada hace 47 años y no deja de ser 10 veces más rápido elaborar un autómata en “Lex” que a mano.
Flex
Conforme a lo que dice (Paxson, Flex, versión 2.5, 1995) en el manual de uso del programa “Flex es una herramienta para generar escáneres: programas que reconocen patrones léxicos en un texto. Flex lee los ficheros de entrada dados, o la entrada estándar si no se le ha indicado ningún nombre de fichero, con la descripción de un escáner a generar.” Esta herramienta fue creada alrededor de 1987 tentativamente 12 años después de la creación de “Lex” esto se refleja en que el código generado paso de ser “C” a “C++” así como un cambio en las reglas de sintaxis para escribir programas, fuera de eso es muy similar a “Lex”, la instalación está disponible para sistemas Windows, UNIX, Linux y cualquier distribución de Ubuntu mientras sea posible descargarlo de su página oficial[footnoteRef:2], podrá funcionar “Flex”, para poner en marcha un programa no se necesita nada más que la propia herramienta y un compilador de “C” o “C++”, sin embargo, el autor (Paxson, Flex, versión 2.5, 1995) sugiere que “Uno de los usos principales de flex es como compañero del generador de analizadores sintácticos Yacc. Los analizadores de Yacc esperan invocar a una rutina llamada ‘yylex()’ para encontrar el próximo token de entrada.”, su estructura es la misma que “Lex” separada por “%%” en donde consta de: [2: (Paxson, Flex for Windows, 2001)] 
definiciones
%%
reglas
%%
código de usuario
Como se ha mencionada anteriormente la herramienta es una reescritura de “Lex” y se podría considerar una sucesora en todos los aspectos, pues resulta mucho más fácil de aprender, por ende, mucho más eficiente en general, ya que cuenta con una sintaxis sobria, fácil implementación con C++ y rapidez de compilación, por supuesto también tiene desventajas como algunos errores en el enlace de los archivos, al igual que incompatibilidades con “Lex”, sin embargo no desmerita lo noble y útil que puede llegar a ser para el aprendizaje en el área de autómatas.
JLex
“Es una herramienta generadora de analizadores léxicos escrito en java y para java la cual fue desarrollada por Elliot Joel Berk en la Universidad de Princenton el 15 de agosto de 1996” (Joel Berk & Scott Ananian, 1996), este analizador se descarga desde su página oficial[footnoteRef:3]; funciona en los sistemas operativos Linux, Windows y Solaris mientras se encuentre instalada cualquier versión de JAVA pues es un requisito para ejecutar el archivo Main.java(Archivo para la generación de las clases para JLex) concluyendo con los requisitos se necesita un generador de analizadores sintácticos para Java en donde Cup es la opción aprobada por el desarrollador. [3: (Berk, JLex: A Lexical Analyzer Generator for Java(TM)-version 1.2.6 , 2003)] 
La estructura de su código es muy parecida a “Flex” ya que un archivo “JLex” está organizado en tres secciones separadas por “%%” en donde según el creador (Berk, JLex: A lexical analyzer generator for Java(TM), 1997) “La primera sección del archivo de especificación se copia directamente en el archivo de salida resultante. Esta área de la especificación proporciona espacio para la implementación de clases de utilidad o tipos de devolución. La sección de directivas de JLex es la segunda parte del archivo de entrada. Aquí, se dan definiciones de macros y se declaran nombres de estado. La tercera sección contiene las reglas del análisis léxico, cada una de las cuales consta de tres partes: una lista de estados opcionales, una expresión regular y una acción.” Así pues, un ejemplo de esta simbología:Código del usuario
%%
Directivas JLex
%%
Reglas de expresiones regulares
 
Las principales ventajas de este analizador léxico consisten en su parecido a “Flex” pues en si es fácil entender su sintaxis, también permite la rápida generación de analizadores léxicos y al estar en java el desarrollo de un programa en JLex se vuelve eficiente, sin embargo, las desventajas más notables sonen la ejecución misma de un programa, ya que para ponerlo en marcha se vuelve un proceso engorroso, una prueba de esto es el proyecto que realizó (Navarro, 2019) donde después de descargar los archivos necesarios y escribir el código tuvo que crear adicionalmente 6 archivos y 3 paquetes solo para su ejecución, en conclusión esta herramienta podría ser una opción viable si no existiera Flex o Lex pues son más prácticos y no se necesita tantos requisitos para poner en marcha un conjunto de instrucciones.
JFlex
Como se vio anteriormente “Lex” y “Flex” comparten muchas características pues una fue basada en la otra siendo así las más reciente una reescritura de la herramienta más antigua; entonces partiendo de este punto se tiene el analizador léxico “JFlex” el cual indican sus autores (Klein, Steve, & Regis, 2020) “Es un generador de analizadores léxicos para Java escrito en Java. También es una reescritura de la herramienta JLex que fue desarrollada por Elliot Berk en la Universidad de Princeton.” La primera versión fue lanzada en mayo del 1998 de acuerdo con su página oficial[footnoteRef:4] en la cual también se puede encontrar los archivos para la instalación desde su versión más antigua hasta la más actual, estas versiones funcionan en Windows, Mac y Unix, es posible integrar un analizador sintáctico a la herramienta, el autor sugiere usar “Cup” sin embargo no es necesaria su integración; en cuanto sus características principales, genera código en lenguaje Java y su estructura es la siguiente: [4: (Gerwin, Steve, & Régis, 1998)] 
{Código del usuario}
%%
{Opciones y declaraciones}
%%
{Reglas lexicográficas}
Anteriormente se mencionó que la mayoría de las herramientas para el análisis léxico se basan en “Lex” y este analizador es un ejemplo de ello pues relativamente tiene la misma estructura solo cambiando la manera de escribir código, así como si sintaxis interna.
Algunas virtudes de este analizador léxico de acuerdo con sus autores (Gerwin, Steve, & Régis, 1998) su sintaxis es compatible con “JLex” que al mismo tiempo está inspirada en “Lex”, también puede escanear archivos Unicode, con soporte para Unicode 7.0 a Unicode 12.1, incluidas las propiedades de Emoji, su punto más destacable se basa en su fácil implementación ya que funciona con bastantes tipos de complementos y proyectos, por supuesto no todo es bueno ya que comparte las desventajas de su predecesor pues resulta un poco engorroso ponerlo en marcha ya que conforme al ejemplo plasmado por (García, 2010) ilustra como llevar a cabo un simple programa lleva algo de tiempo, aun así no desmerita lo flexible que pude ser trabajar con esta herramienta pues es palpable los años de desarrollo que se invirtieron en ella así como su soporte el cual llega hasta el 2020, en conclusión es la mejor alternativa de un analizador léxico que genere código Java, pues es flexible, rápido y muy simple de usar.
Tablas comparativas
	Herramientas
	Sistemas operativos
	Código generado
	Uso de analizador sintáctico
	Lex
	Windows, UNIX, Linux y Ubuntu
	C
	Utiliza Yacc
	Flex
	Windows, UNIX, Linux y Ubuntu
	C++
	Utiliza Yacc/Bison
	JLex
	Linux, Windows y Solaris
	Java
	Utiliza Cup, Bison/Yacc
	JFlex
	Windows, Mac y Unix
	Java
	Utiliza Cup
Para ilustrar de manera más cómoda y simple las diferencias entre estos analizadores léxicos se presenta la Tabla 1 y la Tabla 2 en donde ilustra sus virtudes, así como sus requisitos generales, pues esto es importante al momento de empezar con el aprendizaje de una herramienta de este tipo.
En la Tabla 1 se muestra los sistemas operativos en donde funciona cada herramienta así el lenguaje del código que genera y por último muestra si permite el uso de generadores sintácticos los cuales sirven para hacer más completas y versátiles estas herramientas.
Tabla 1-Caracteristicas principales
En la Tabla 2 se muestran las ventajas y desventajas de cada herramienta analizada en este trabajo.
	Herramientas
	Ventajas
	Desventajas
	Lex
	Rapidez de codificación, sentar las bases para la elaboración de analizadores léxicos y comodidad en el desarrollo de autómatas.
	Antigüedad de sintaxis, la depuración del código generado resulta complicado y la eficiencia depende intrínsicamente del lenguaje de programación generado.
	Flex
	Sintaxis retocada y simple de entender, eficiencia en la compilación del código generado debido a que utiliza "C++" así como rapidez de uso y aplicación.
	Errores en el enlace de archivos compilados y algunas incompatibilidades con "Lex"
	JLex
	Rápida compilación del código generado, fácil implementación con herramientas externas y soporte con múltiples librerías.
	Al igual que flex es algo arcaica esta herramienta por lo que es ineficiente en muchos casos y complicada de utilizar.
	JFlex
	Rapidez generando analizadores, soporte completo con caracteres Unicode, su sintaxis es cómoda de manipular y fácil de interpretar.
	Algunos problemas de compatibilidad.
Tabla 2-Ventajas y desventajas
Conclusión
En conclusión, este trabajo requirió una ardua tarea de investigación la cual dio como resultado una apreciación diferente de las herramientas de software para el análisis léxico pues son muy importantes para los tiempos que corren, ya que bien mencionan (Hernández Palacios & Hernández González, 2013) “A partir de los años 50 es necesario un compilador derivado de los lenguajes de alto nivel. Desde entonces, gracias al descubrimiento de técnicas sistemáticas para el manejo de muchas tareas, al desarrollo de buenos lenguajes de implantación, entornos de programación y herramientas de software, el diseño y desarrollo de un compilador se ha simplificado enormemente.” Esto es gracias a la creación de todas estas herramientas las cuales simplifican en enormes cantidades el generar autómatas, compiladores o algún otro programa que necesite el análisis léxico o sintáctico pues de no existir se tendrían que realizar a mano lo que resulta en una tarea tardada y tediosa; así que para concluir este análisis hay que mencionar lo practicas y útiles que pueden llegar a ser estas herramientas para la formación de un profesionista en T.I.
Referencias bibliográficas
Berk, E. (29 de 10 de 1997). JLex: A lexical analyzer generator for Java(TM). Obtenido de https://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html#SECTION2
Berk, E. (02 de 07 de 2003). JLex: A Lexical Analyzer Generator for Java(TM)-version 1.2.6 . Obtenido de https://www.cs.princeton.edu/~appel/modern/java/JLex/Archive/1.2.6/Main.java
Búcaro, J. (26 de 04 de 2015). Análisis Léxico usando JFlex. Obtenido de https://jonathanbucaro.com/2015/04/26/analisis-lexico-usando-jflex/
Casado, M. F. (23 de 03 de 2014). JFlex. Diseño de compiladores. Obtenido de https://docplayer.es/6265304-Jflex-diseno-de-compiladores-jflex-funcionamiento-archivo-de-especificacion-codigo-de-usuario-23-03-2014.html
Coraza, A. I. (11 de 2018). uaemex Repositorio Institucional. Obtenido de https://ri.uaemex.mx/bitstream/handle/20.500.11799/99662/TESIS.%20APLICACI%D3N%20DE%20LAS%20HERRAMIENTAS%20JFLEX%20Y%20CUP.pdf;jsessionid=D6B30597C18786F5A468CEDE8141ACC5?sequence=1
Departamento de Trasnferencia de Tecnologia. (31 de 10 de 2009). u-cursos. Obtenido de https://www.u-cursos.cl/ingenieria/2009/2/CC3102/1/material_docente/bajar?id=260380
García, L. A. (11 de 05 de 2010). Tutorial JFlex. Obtenido de https://uempl.wordpress.com/2010/05/11/75/
Gerwin, K., Steve, R., & Régis, D. (05 de 1998). JFlex. Obtenido de https://www.jflex.de
Hernández Palacios, R., & Hernández González, D. (05 de 07 de 2013). Herramientas para el diseño de compiladores. Obtenido de https://repository.uaeh.edu.mx/revistas/index.php/huejutla/article/view/1024/4817
Joel Berk, E., & Scott Ananian, C. (15 de 08 de 1996). JLex: A Lexical Analyzer Generator for Java(TM). Obtenido de https://www.cs.princeton.edu/~appel/modern/java/JLex/
Klein, G., Steve, R., & Regis, D. (02 de 05 de 2020). JFlex User's Manual. Obtenido de https://www.jflex.de/manual.pdfMarcos, F. (16 de 03 de 2015). FLEX. Obtenido de https://pdfcoffee.com/flex-pdf-free.html
Mike, L., & Schmidt, E. (21 de 07 de 1975). Lex - A Lexical Analyzer Generator. Obtenido de https://www.cs.utexas.edu/users/novak/lexpaper.htm
Navarro, E. (26 de 04 de 2019). ICARUS. Obtenido de https://ericknavarro.io/2019/04/26/02-Mi-primer-proyecto-utilizando-Jlex-y-Cup-Windows/
Paxson, V. (04 de 1995). Flex, versión 2.5. Obtenido de http://webdiis.unizar.es/asignaturas/LGA/docs_externos/flex-es-2.5.pdf
Paxson, V. (15 de 04 de 2001). Flex for Windows. Obtenido de http://gnuwin32.sourceforge.net/packages/flex.htm
Pedro Bavera, F., & Martín Nordio, D. (02 de 05 de 2003). TesisJTLex-Bavera-Nordio-02.pdf. Obtenido de https://dc.exa.unrc.edu.ar/staff/fbavera/papers/TesisJTLex-Bavera-Nordio-02.pdf
Wattenberg, F. S. (29 de 04 de 2003). El generador de analizadores léxicos lex. Obtenido de https://www.infor.uva.es/~mluisa/talf/docs/labo/L3.pdf
Zárate, R. V. (2018). ANALIZADOR LEXICO LEX. Obtenido de https://docplayer.es/19329159-Analizador-lexico-lex.html
2

Otros materiales