Teoría de Lenguajes
Curso 2021
Laboratorio 1 – Expresiones regulares
El propósito de este laboratorio es trabajar con expresiones regulares de una manera práctica, para lo cual se propone escribir programas en el lenguaje Python.
El trabajo está enfocado en resolver los problemas haciendo un fuerte uso de expresiones regulares, evitando sustituirlas por sentencias regulares de programación (a menos que se indique lo contrario). En general los programas se pueden resolver en menos de 15 líneas.
Modo de trabajo
• Se indicarán 5 programas a realizar.
• Se entregarán para cada programa archivos de entrada y archivos de salida, que contienen la salida que se debería obtener para su respectiva entrada.
• El estudiante, en base a lo especificado por la letra, la entrada, y su correspondiente salida de referencia, deberá implementar su programa.
• La salida del programa del estudiante deberá ser idéntica a la salida de referencia. • Se deberá respetar los nombres de los archivos de entrada, de salida, y de los
programas Python.
• Se proporcionará un archivo comprimido que contiene lo siguiente: ◦ Los archivos de entrada.
◦ Los archivos con las salidas de referencia.
◦ Los archivos Python que deben implementar, dentro del subdirectorio “programas”.
Parte 1 – Limpieza de tweets
Una tarea recurrente en el área del Procesamiento de Lenguaje Natural (área que ha utilizado muchos formalismos de la teoría de lenguajes formales) es la de clasificar textos según un criterio. Particularmente los tweets son muy utilizados, dada su fácil obtención, para tareas como detectar si el emisor tuvo intención humorística o no, entre otras cosas. Este tipo de tareas suelen ser abordadas mediante la implementación de algoritmos de aprendizaje automático.
Es común que antes de darle los tweets como entrada al algoritmo de aprendizaje automático éstos sean preprocesados, modificándolos para que su forma sea más favorable para el algoritmo. En esta parte del laboratorio escribiremos un script que remueva de un tweet las menciones, hashtags, y links.
Asumiremos que los links son todo string que comience con “http”. De las menciones y los hashtags, asumiremos que son de la forma “@c1...cn” y “#c1...cn” respectivamente, donde
cada ci es un caracter que es o bien alfanumérico, o bien el caracter ‘_’.
En esta primera parte, implementaremos un mismo programa de dos formas diferentes: mediante sentencias de programación y mediante expresiones regulares. La idea es poder comparar estos dos enfoques.
programa1.py
Su entrada es un tweet, y su salida el tweet sin menciones, hashtags ni links. Solamente
por esta parte, no está permitido usar expresiones regulares. El programa debe ser
implementado mediante la utilización de funciones nativas de Python.
programa2.py
Su entrada es un tweet, y su salida el tweet sin menciones, hashtags ni links. La implementación debe realizarse únicamente mediante la utilización de expresiones regulares.
Parte 2 – Procesamiento de archivos SCSS
Cascading Style Sheets, mejor conocido como CSS, es un lenguaje utilizado para describir la presentación gráfica de documentos escritos en un lenguaje de marcado, por ejemplo, HTML. En esta parte del laboratorio trabajaremos analizando los contenidos de archivos con una versión simplificada del lenguaje CSS que llamaremos SCSS, definida a continuación.
Lenguaje SCSS
Los archivos SCSS contienen la definición del estilo de una o más entidades. Estas entidades pueden ser:
• Un tag, representado por una palabra.
• Una clase, representada por un punto seguido de una palabra.
• El id de un elemento, representado por un numeral seguido de una palabra.
Para definir el estilo de una entidad se escribe su nombre seguido de un espacio y luego, encerrada en llaves (‘{‘ y ‘}’), una lista de propiedades y sus valores. Cada propiedad tiene la siguiente forma:
nombre-propiedad: valorPropiedad;
Para toda propiedad, nombre-propiedad es una string cuyos caracteres son letras y/o guiones, y valorPropiedad es una string cuya única restricción es que no contiene ninguno de los siguientes caracteres: ‘;’ ‘:’ ‘{‘ ‘}’.
Ejemplo de archivo SCSS body { color: rgb(240,240,240); font-size: 14px; } .algunaClase { background-color: rgb(240,240,240); margin-top: 5px; color: #ff00a6 }
Implemente en Python los siguientes programas:
programa3.py
Dado el contenido de un archivo SCSS, retorna la cantidad de tags, clases e IDs declarados, con el siguiente formato:
tags: n clases: m ids: p
programa4.py
Dado el contenido de un archivo SCSS, retorna el mismo archivo, pero removiendo todas las líneas que declaren la propiedad de font-size. Si una entidad contiene únicamente la declaración de la propiedad font-size, deberá eliminarse la entidad por completo.
programa5.py
Dado el contenido de un archivo SCSS, por cada entidad que tenga la propiedad color con su valor declarado utilizando la función rgb, retorna una línea con el formato “nombreEntidad valorDelColor”.
Una posible salida sería: .clase1 rgb(240,17,0) body rgb(240,240,240) #unID rgb(0,0,0)
Herramientas a utilizar
Recomendamos utilizar Python 3.9 [1], o por lo menos Python 3.7. Por más información consultar su documentación [2].
Utilizaremos además el módulo de expresiones regulares de Python, llamado re. Sugerimos consultar los sitios [3] y [4] para aprender sobre el mismo.
Desarrollo del trabajo
Los trabajos se deben realizar en grupos de 2, 3 o 4 estudiantes. No pueden realizarse de forma individual. Si se detectan trabajos copiados, o si se publican soluciones tanto parciales como completas en los foros de consulta, se sancionará con la pérdida del laboratorio.
Entrega
El límite para la entrega es el 29 de abril a las 23:59. Próximo a esta fecha se habilitará un formulario en EVA para realizar la entrega.
No necesitan inscribir el grupo previo a la entrega.
Se debe entregar:
• Los archivos programa{1,2,3,4,5}.py con los programas implementados
• Un archivo integrantes.txt con las cédulas, sin puntos ni dígito de verificación, y nombres, sin tildes, de los integrantes del grupo (uno por línea). Opcionalmente, se puede agregar una última linea con algún comentario, en caso de que algún programa no les haya funcionado correctamente.
Formato del archivo integrantes.txt: 1234567,Perez,Santiago 4567123,Martinez,Veronica
3444555,Garcia Rodriguez,Juan Jose
Corrección
La corrección se realizará en el sistema operativo Linux. Si bien en la mayoría de los casos el funcionamiento de los programas es igual en Linux y Windows, recomendamos ejecutar los casos de prueba en Linux antes de entregar.
Utilizaremos los casos de prueba que les entregamos para la corrección (además de algunos extra), por lo tanto si la ejecución cancela, o hay diferencia en los archivos de salida con la salida oficial, la solución no se considerará correcta. Recordamos, que la solución debe ser realizada mediante el uso de expresiones regulares, y no sentencias de programación, a excepción del programa 1.
Es parte de las normas usar los nombres y formatos de los programas y el archivo integrantes.txt, y se penalizarán las entregas que no cumplan esto.
Referencias
[1] https://www.python.org/downloads/release/python-392/
[2] https://docs.python.org/3/
[3] https://docs.python.org/3/library/re.html