Durante esta actividad, los alumnos serán capaces de:
Un resaltador de léxico, usualmente llamado (de manera técnicamente incorrecta) resaltador de sintaxis, es una herramienta que resalta diferentes componentes léxicos de un código fuente, como palabras clave, operadores y comentarios, utilizando colores distintivos para mejorar la legibilidad y comprensión del código.
En las décadas de 1960 y 1970, cuando los lenguajes de programación comenzaron a surgir, los programadores se enfrentaron al desafío de escribir código en terminales de texto que carecían de capacidades visuales avanzadas. Con el advenimiento de los editores de texto y los entornos de desarrollo integrados (IDE, por sus siglas en inglés) en las décadas de 1980 y 1990, los resaltadores de léxico se convirtieron en características estándar. Los IDE modernos utilizan técnicas avanzadas de análisis léxico y sintáctico para proporcionar un resaltado preciso para una amplia variedad de lenguajes de programación.
Las expresiones regulares, que estudiamos como parte del tema de la teoría de autómatas, son fundamentales para el desarrollo de los resaltadores de léxico debido a su capacidad para analizar la estructura de lenguajes formales.
Este proyecto consiste en desarrollar un resaltador de léxico para el lenguaje JSON (JavaScript Object Notation). JSON es un formato ligero y fácil de leer utilizado para el intercambio de datos estructurados entre diferentes sistemas. Se ha convertido en un estándar ampliamente utilizado en el desarrollo web y en la comunicación entre aplicaciones. Para fines prácticos, JSON es un subconjunto del lenguaje JavaScript.
Un documento de JSON está compuesto por valores que pueden ser booleanos, números, cadenas de caracteres, arreglos y objetos. Los objetos son similares a los mapas o diccionarios de otros lenguajes: son una colección de pares de clave-valor, donde las claves son cadenas de caracteres y los valores pueden ser de cualquiera de los tipos de datos ya mencionados.
En los equipos ya conformados, escribir un programa en Clojure llamado resaltador.clj
que produzca un documento de HTML+CSS en el que se resalte el léxico de un archivo JSON proporcionado.
Los tipos de tokens que debe ser resaltados son los que están documentados en el sitio oficial de JSON.org, los cuales se enumeran a continuación para evitar alguna confusión:
true
, false
y null
{
y }
), corchetes ([
y ]
), dos puntos (:
) y coma (,
)
* NOTA: Por simplicidad se considera que una cadena de caracteres es una secuencia de cero o más caracteres delimitados entre comillas dobles ("
). Dicha secuencia no puede incluir un enter (en otras palabras, una cadena de caracteres debe iniciar y terminar en la misma línea) ni tampoco puede incluir el carácter de comillas dobles a no ser que venga como parte de una secuencia de escape (\"
).
Cualquier otra serie de caracteres que no sea parte de los tokens arriba listados debe ser resaltado como un token erróneo tal como se muestra en el ejemplo que se muestra más adelante.
El programa debe definir una función llamada json->html
que reciba como argumento una cadena de caracteres con el nombre de un archivo de texto en formato JSON y debe generar otro archivo con el mismo nombre pero con extensión .html
con el contenido esperado.
El reconocimento de los tokens debe hacerse a través de expresiones regulares.
El código fuente de la entrada debe convertirse a HTML y colocarse completamente dentro de un elemento <pre>
...</pre>
en el cuerpo del documento de salida. A su vez, cada token que deba ser resaltado debe quedar dentro de un elemento <span>
...</span>
. El coloreado de los tokens se debe llevar a cabo usando CSS embebido directamente en el documento HTML.
Los colores utilizados para resaltar cada tipo de token quedan al gusto y criterio de cada equipo. Sin embargo, es importante que se pueda distinguir fácilmente una categoría léxica de cualquier otra. Así mismo, debe existir un buen contraste entre los colores del texto y su fondo.
Todo el whitespace (espacios, tabuladores, saltos de línea) del archivo de entrada debe quedar exactamente igual en el documento de salida.
Para evitar conflictos con ciertos caracteres especiales de HTML es indispensable que ciertos caracteres en el archivo de entrada sean reemplazados en el documento de salida por sus correspondientes secuencias de escape:
<
(menor que) ➔ <
>
(mayor que) ➔ >
&
(ampersand) ➔ &
Al inicio del archivo fuente debe haber un comentario con la matrícula y el nombre de los integrantes del equipo, así como una breve descripción del proyecto.
Cada función de Clojure definida en su programa debe contar con una cadena de documentación con un breve enunciado de su intención.
Todo el código debe seguir las convenciones de estilo y codificación de Clojure.
Suponiendo que se tiene el siguiente archivo de texto en formato JSON llamado mi_ejemplo.json
:
[ {"movie": "King Kong", "year": 1933, "director": "Merian C. Cooper", "oscarWinner": null, "imdb": 790.0E-2}, { "movie" : "Jaws", "year" : 1975, "director" : "Steven Spielberg", "oscarWinner" : true, "imdb" : 0.80E+1 }, {"movie":"Avengers: \"Endgame\"","year":2019,"imdb":8.4}, { badToken : "bad string (no closing quotes) } ]
Para crear el documento HTML que resalte su léxico se tendría que ejecutar la siguiente expresión en Clojure:
(json->html "mi_ejemplo.json")
El documento HTML recién creado debe llamarse mi_ejemplo.html
y debe estar situado en el mismo directorio que el archivo original (mi_ejemplo.json
). Al abrir el documento HTML en un browser se debe ver algo similar a lo que se muestra a continuación:
Es importante notar que los caracteres que no son parte de un token válido están resaltados claramente con un color distinto a los demás tokens que sí son válidos (rojo en el ejemplo de arriba).
El archivo fuente del programa debe incluir en la parte superior y dentro de un comentario la información personal de los autores (matrícula y nombre). Por ejemplo:
;---------------------------------------------------------- ; Proyecto: Resaltador de léxico de JSON ; Fecha: 14 de junio, 2023. ; Autores: ; A01770771 Sylvie Laufeydottir ; A01777771 Loki Laufeyson ;----------------------------------------------------------
Para entregar el archivo resaltador.clj
, ingresa los siguientes datos:
Solo es necesario que lo entregue un miembro del equipo.
La fecha límite es el miércoles 14 de junio.