Escuela Técnica Superior de Ingenieros Informáticos

Universidad Politécnica de Madrid

Procesadores de Lenguajes

Estás aquí:

Inicio > Práctica

Práctica

(Curso 2023/2024)

Contenido:


Normas de la Práctica

Las Prácticas están propuestas para ser realizadas en grupos de un tamaño máximo de 3 personas. En la valoración de estas Prácticas no se tendrá en cuenta el número de miembros que componen el grupo, las dificultades de coordinación surgidas dentro del grupo, etc.

Los estudiantes matriculados deben formar los grupos de trabajo apuntando su composición a través de la página de grupos. Este es el mecanismo mediante el que se obtiene el número de grupo. Cuando cada grupo se haya dado de alta correctamente, se le asignarán las opciones de su Procesador en cuanto a características del lenguaje, el tipo de Analizador Sintáctico, etc.

Cada grupo se identifica por un número que debe figurar siempre en las memorias y materiales entregados. Para cualquier tipo de consulta relacionada con las Prácticas será imprescindible conocer el número de grupo.

La Práctica consiste en el diseño e implementación de un Procesador de un Lenguaje, que realice el Análisis Léxico, Sintáctico y Semántico (incluyendo la Tabla de Símbolos y el Gestor de Errores), para un determinado lenguaje de programación. El trabajo se abordará de una manera incremental durante el curso, realizando entregas intermedias.

Para la convocatoria extraordinaria, la Práctica (y las opciones asignadas a los grupos) será la misma que la propuesta en el correspondiente semestre del mismo curso.

Funcionamiento del Procesador

El Procesador deberá leer el programa fuente de un archivo de texto y entregar necesariamente varios archivos de texto (lista de tokens, parse, tabla de símbolos y errores detectados). El funcionamiento tiene que ser obligatoriamente el siguiente:

  • Entrada:
    • Fichero fuente: El Procesador ha de recibir un archivo de texto cuyo contenido es el programa que se desea analizar.
  • Salida. Para facilitar las tareas de depuración y de corrección de la Práctica, es necesario mostrar los resultados de los distintos módulos del Procesador. Por ello, el Procesador de la práctica deberá generar obligatoriamente los siguientes ficheros:
    • Fichero de tokens: Listado de todos los tokens generados para la entrada analizada. El formato del fichero de tokens ha de ser, obligatoriamente, el que se indica en la página de Documentación.
    • Fichero de Tabla de Símbolos: Volcado completo "legible" con toda la información de todas las Tablas de Símbolos (incluidas las locales). Cada Tabla de Símbolos deberá volcarse al fichero después de que haya sido completada y antes de su destrucción. El formato del fichero de tabla de símbolos ha de ser, obligatoriamente, el que se indica en la página de Documentación.
    • Fichero del parse: Listado de los números de las reglas utilizadas para realizar el Análisis Sintáctico de la entrada. El formato de los ficheros de parse y gramática ha de ser, obligatoriamente, el que se indica en la página de Documentación (pues se utilizará como entrada para la aplicación de visualización de árboles VASt).
    • Listado de errores: Si el programa fuente que se está analizando es incorrecto, deberá proporcionarse un listado en formato libre con los errores detectados por el Procesador (este listado se podrá mostrar alternativamente por pantalla). Para cada error hay que indicar al menos el número de la línea donde se ha detectado el error, el tipo de error detectado (léxico, sintáctico o semántico) y un mensaje claro (escrito en términos del usuario, no del programador del Procesador) que explique el error detectado y que permita su corrección.

Para poder visualizar gráficamente los árboles sintácticos construidos por el Analizador Sintáctico para las cadenas correctas, se cuenta con la herramienta VASt, cuyo uso es obligatorio: deberá utilizarse en la demostración de la práctica para mostrar el árbol sintáctico (y no se admitirá la visualización del árbol con ninguna otra herramienta). VASt recibe como entrada la gramática independiente del contexto del lenguaje (correspondiente a la sintaxis del lenguaje) y un parse, y visualiza el árbol sintáctico que se corresponde con dicho parse. Estos dos ficheros de entrada han de tener los formatos de ficheros para parse y gramática que se indica en la sección de Documentación).

Incumplir cualquiera de los requisitos de ficheros y formatos indicados supondrá no aprobar la Práctica.

Presentación

La Práctica se deberá diseñar y programar de forma incremental, realizando dos entregas parciales y una presentación final.

Las entregas parciales (a través de Moodle) deberán tener los siguientes contenidos:

  • Primera entrega: Analizador Léxico y Tabla de Símbolos. Deberán diseñarse e implementarse estos dos módulos. Se deberá entregar una memoria (extensión máxima de 10 páginas sin contar el anexo) con los siguientes contenidos:
    • Diseño del Analizador Léxico (tokens, gramática, autómata, acciones semánticas y errores)
    • Diseño inicial de la Tabla de Símbolos (diseño de su estructura y organización). No se debe describir el formato del fichero de Tabla de Símbolos.
    • Anexo con 6 casos de prueba para mostrar el funcionamiento del Procesador construido, la mitad correctos y la mitad con errores léxicos. Deberá incluirse el listado del código fuente de cada caso de prueba, el volcado de los ficheros de tokens y el volcado de los ficheros de tablas de símbolos (para los 3 casos de prueba correctos) o el listado de errores detectados (para los 3 casos de prueba incorrectos). Los resultados de los casos de prueba deben ser generados por el procesador implementado, sin ningún tipo de edición manual.
  • Segunda entrega: Analizador Sintáctico. Deberá diseñarse e implementarse este módulo, añadiéndolo a los módulos anteriores. Se deberá entregar una memoria (extensión máxima de 10 páginas sin contar el anexo) con los siguientes contenidos:
    • Diseño del Analizador Sintáctico (gramática, demostración de que la gramática es adecuada para el método de Análisis Sintáctico asignado, y el autómata o las tablas LR, la tabla LL o el pseudo-código con funciones del Analizador, en función de su tipo).
    • Anexo con 6 casos de prueba para mostrar el funcionamiento del Procesador, la mitad correctos y la mitad con errores sintácticos. Deberá incluirse el listado del código fuente de cada caso de prueba, el volcado de los ficheros de parse y el árbol sintáctico generado con la herramienta VASt (para los 3 casos de prueba correctos) o el listado de errores detectados (para los 3 casos de prueba incorrectos). Los resultados de los casos de prueba deben ser generados por el procesador implementado, sin ningún tipo de edición manual.

La presentación final (presencial) de la práctica consiste en:

  • Una demostración que mostrará el funcionamiento del Procesador completo (permitiendo la consulta de todos los ficheros generados y la visualización del árbol sintáctico mediante la herramienta VASt) ante uno de los profesores de la asignatura.
    • Esta demostración se realiza durante los días alrededor a la fecha tope de cada entrega (en la fecha elegida por cada grupo entre las ofertadas). Cada grupo ha de reservar día y hora para realizar la presentación (la reserva estará disponible aproximadamente una semana antes de la fecha tope de entrega y cada grupo deberá estar apuntado antes de la fecha tope de la entrega de cada convocatoria para poder asegurarse una plaza).
    • El grupo deberá asistir a esta presentación con la memoria y todo el software preparado para poder realizar la demostración completa de su Procesador y poder mostrar todas las salidas y visualizar con la herramienta VASt los árboles que se generen durante la demostración.
  • Una memoria (extensión máxima de 30 páginas sin contar el anexo) que incluya:
    • Una descripción del diseño final del Procesador, según las opciones correspondientes al grupo de prácticas, así como cualquier otro aspecto o característica que se desee hacer notar por su interés, sin incluir listados fuente del procesador ni detalles de la implementación. Esta memoria deberá incluir al menos:
      • Diseño del Analizador Léxico actualizado: tokens, gramática, autómata, acciones semánticas y errores.
      • Diseño del Analizador Sintáctico actualizado: gramática, demostración de que la gramática es adecuada para el método de Análisis Sintáctico asignado, y las tablas, autómata o procedimientos de dicho Analizador.
      • Diseño del Analizador Semántico: Traducción Dirigida por la Sintaxis con las acciones semánticas.
      • Diseño de la Tabla de Símbolos completa: descripción de su estructura final y organización.
      • Diseño del Gestor de Errores: manejo de los mensajes de error, gestión del número de línea...
    • Anexo con 10 casos de prueba. Deberá incluirse en la memoria un anexo con los 10 casos listados. La mitad de ellos serán correctos y la otra mitad erróneos, de tal manera que permitan observar el comportamiento del Procesador. Para los ejemplos correctos se incluirá el listado de tokens, el árbol de análisis sintáctico (que se generará obligatoriamente utilizando la herramienta VASt) y el volcado de la Tabla de Símbolos. Para los 5 ejemplos erróneos se incluirá el mensaje o mensajes de error obtenidos. Los resultados de los casos de prueba deben ser generados por el procesador implementado, sin ningún tipo de edición manual.
  • La implementación. Deberán entregarse todos los ficheros de la práctica. Contendrá, al menos, los fuentes y el ejecutable del Procesador (junto con todas las librerías y ficheros necesarios para su ejecución), la memoria de la Práctica, los 10 casos de prueba (incluyendo los ficheros resultantes de su ejecución) y un fichero con la gramática obligatoriamente en el formato requerido por la herramienta VASt. Para facilitar la prueba de los ejecutables, éstos deberán ser compilados preferentemente para su ejecución sobre una consola DOS o Windows. Los ficheros entregados deberán estar exentos de todo tipo de virus y programa sospechoso; en caso de detectarse algún virus o sospecha de virus en un fichero, no se corregirá la Práctica y se considerará automáticamente como suspensa. Así mismo, se recuerda que la Práctica es un trabajo personal del grupo de prácticas, con lo que cualquier indicio de que el grupo no ha realizado él mismo completamente la práctica (por ejemplo, la copia de fragmentos de código de Procesadores de Lenguajes de Internet o el uso de programadores automáticos) hará que ésta se considere suspensa.

Cada entrega parcial se evaluará con un 10% de la nota de la práctica. El resto de la nota corresponde a la presentación final. El estudiante que no realice alguna entrega parcial no obtendrá ese 10% de la nota, aunque sí podrá realizar el resto de entregas. En cualquier caso, se recuerda que cada entrega es incremental, por lo que el Procesador construido al final deberá contener todos los módulos del Procesador correspondientes a las entregas anteriores.

En los ejemplos usados en cada una de las entregas de la práctica no se podrán emplear ejemplos obtenidos de Draco ni de cualquier otra fuente. Deben ser ficheros originales escritos por el propio grupo de prácticas para probar distintos aspectos del lenguaje analizado.

Calificación

Para poder optar a una nota no inferior a 4 puntos en la Práctica, será condición imprescindible que esté completa (es decir, implementados el análisis léxico, análisis sintáctico, análisis semántico, la tabla de símbolos y el gestor de errores), produciendo todos los ficheros especificados, y que puedan generarse y visualizarse los árboles de análisis sintáctico mediante la herramienta VASt.

Plazos de entrega

Las fechas para las entregas parciales y para las entregas finales son las siguientes:

  • 23 de octubre de 2023: Entrega parcial que incluirá el Analizador Léxico y la Tabla de Símbolos.
  • 21 de noviembre de 2023: Entrega parcial que incluirá el Analizador Léxico, la Tabla de Símbolos y el Analizador Sintáctico.
  • 8 de enero de 2024: Entrega final del Procesador que incluirá el Analizador Léxico, Tabla de Símbolos, Analizador Sintáctico, Analizador Semántico y Gestor de Errores, para la convocatoria ordinaria del semestre actual.
  • 20 de junio de 2024: Entrega final del Procesador que incluirá el Analizador Léxico, Tabla de Símbolos, Analizador Sintáctico, Analizador Semántico y Gestor de Errores, para la convocatoria extraordinaria.

Para realizar la presentación final del Procesador, se publicará un calendario (con fechas y horas) en que cada grupo se tiene que apuntar con antelación (el calendario se publica aproximadamente una semana antes de la fecha de entrega). El calendario tendrá días alrededor de la fecha de entrega, dado que es imposible evaluar a todos los grupos en el mismo día. Cada grupo se tendrá que apuntar en dicho calendario obligatoriamente antes de la fecha del correspondiente plazo de entrega (indicado en este apartado). En caso contrario, no se garantiza que se pueda realizar la presentación. La entrega de la documentación de la práctica deberá realizarse no más tarde de las fechas indicadas en este apartado.

Especificación de la Práctica

La Práctica consistirá en el diseño y construcción de un Analizador de una versión del lenguaje JavaScript llamado JS-PdL para Procesadores de Lenguajes. Si bien la especificación sintáctica completa del lenguaje JS puede encontrarse en los libros, documentación y manuales de JavaScript (Bibliografía de JavaScript), toda la información del lenguaje que hay que tener en cuenta para esta Práctica se ha recogido en un resumen de las características de JS-PdL.

Para la implementación del analizador se podrá utilizar cualquier entorno, lenguaje de programación o herramienta, siempre que su resultado se pueda ejecutar en un PC, preferentemente bajo Windows.

Para la corrección de las prácticas por los profesores así como para ayudar al grupo de prácticas con su depuración es necesario que: El resultado del analizador léxico se guarde en un fichero de tokens; el resultado del analizador sintáctico tiene que poderse visualizar con la herramienta VASt; el resultado de la tabla de símbolos y del analizador semántico se tiene que guardar en el fichero de tabla de símbolos; y los errores detectados por cualquiera de los módulos deben poderse consultar en pantalla o en fichero y deben ser lo suficientemente descriptivos (incluyendo al menos el número de línea y una indicación del error detectado).

Lenguaje JS-PdL

Deben incluirse las características generales de JS-PdL. El fuente estará en un único fichero con extensión ".javascript" o ".txt", que contendrá un programa con todas las definiciones necesarias en su interior.

La parte común a todos los grupos tendrá que incorporar, al menos:

Parte específica de cada grupo:

Técnicas de Análisis

Cada grupo tendrá asignado un método de Análisis Sintáctico:

Las opciones de la Práctica de construcción de un Procesador de JS-PdL asignadas a cada grupo se pueden consultar en la página de grupos.