Práctica
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 alumnos que componen el grupo, las dificultades de coordinación surgidas dentro del grupo, etc.
La Práctica consiste en el diseño e implementación de un Generador de Código Intermedio y un Generador de Código Ensamblador (que tenga en cuenta el Entorno de Ejecución) para un determinado lenguaje de programación. El trabajo se abordará de una manera incremental, partiendo del Analizador Léxico, el Analizador Sintáctico, el Analizador Semántico y la Tabla de Símbolos (realizados en la Práctica de Procesadores de Lenguajes) y completándolo con el Generador de Código Intermedio y el Generador de Código (que tenga en cuenta el Entorno de Ejecución). El Traductor construido deberá generar uno de los códigos ensamblador indicados en la página de Herramientas
Los estudiantes deben formar los grupos de trabajo basándose en los grupos creados para la asignatura de Procesadores de Lenguajes (aunque no es imprescindible que se mantengan todos los miembros del grupo de dicha asignatura y se permite mezclar grupos).
Funcionamiento del Traductor
El Traductor deberá leer el programa fuente de un archivo de texto y entregar varios archivos de texto (código intermedio y código ensamblador). Ha de tener obligatoriamente el siguiente funcionamiento:
- Entrada:
- Fichero fuente: El Traductor ha de recibir un archivo de texto cuyo contenido es el programa que se desea traducir.
- 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 Traductor. Por ello, el Traductor de la práctica deberá generar obligatoriamente los siguientes ficheros:
- Fichero de Código Intermedio: Programa en código intermedio de 3 direcciones equivalente al programa fuente. Deberá usarse obligatoriamente el formato del fichero de cuartetos descrito en la página de Documentación.
- Fichero de Código Objeto: Programa en código ensamblador equivalente al programa fuente. El lenguaje ensamblador generado deberá ser obligatoriamente el lenguaje Ensamblador descrito en la página de Documentación.
Para poder ejecutar el programa objeto obtenido, deberá utilizarse alguna de las Herramientas de Ensamblador que se ofrecen en esta web.
Presentación
La presentación de la práctica consiste en:
- Una demostración del funcionamiento del Traductor ante uno de los profesores de la asignatura.
- Esta demostración se realiza durante los días previos a la fecha tope de cada entrega. Cada grupo ha de reservar día y hora para realizar la demostración apuntándose en el cuadro de horarios que se publicará (este cuadro se publica aproximadamente una semana antes de la fecha tope de entrega).
- Una memoria (extensión máxima de 30 páginas sin contar con el anexo) que incluya:
- Una descripción del diseño del Traductor correspondiente a la parte realizada así como cualquier otro aspecto o característica que se desee hacer notar por su interés, sin incluir los listados fuente del Traductor. La memoria debe incluir el diseño del Generador de Código Intermedio (Traducción Dirigida por la Sintaxis con las acciones semánticas), el diseño de los Registros de Activación y el diseño del Generador de Código Final.
- Anexo con 5 casos de prueba correctos y sus correspondientes listados de compilación y ejecución, de tal manera que permitan observar el comportamiento completo del Traductor.
- La implementación, que contendrá, al menos, los fuentes y el ejecutable del Traductor (junto con todas las librerías y ficheros necesarios para su ejecución), los 5 casos de prueba (incluyendo los ficheros resultantes de su ejecución) y la memoria de la Práctica. Para facilitar la prueba de los ejecutables, éstos deberán ser compilados preferentemente para su ejecución sobre una consola DOS o en Windows. Los ficheros entregados deberán estar exentos de todo tipo de virus y programa sospechoso; en caso de detectarse algún virus, no se corregirá la Práctica y se considerará 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 completamente la práctica hará que ésta se considere suspensa, aplicándose la normativa vigente.
Calificación
Para poder aprobar la asignatura, será condición imprescindible que la Práctica esté completa (Generador de Código Intermedio y Generador de Código Final implementados).
La Práctica constituye el 40% de la calificación global de la asignatura. La nota ponderada de la Práctica se sumará a la obtenida de ponderar la calificación de la parte teórica, siempre que ninguna de ellas antes de la ponderación sea inferior a 4 (véanse las normas generales de Traductores de Lenguajes).
Plazos de entrega
Las fechas tope para entregar y demostrar el funcionamiento del Traductor en el examen oral son las siguientes.
- 2 de junio de 2025: Presentación del Traductor completo, para la convocatoria ordinaria.
- 23 de junio de 2025: Presentación del Traductor completo, para la convocatoria extraordinaria.
Especificación de la Práctica
La Práctica que hay que realizar consiste en el diseño y construcción de un traductor completo de un subconjunto del lenguaje JavaScript llamado JS--. 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--. 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), el lenguaje JS-- es una simplificación de JavaScript.
Para la implementación del Traductor se podrá utilizar cualquier lenguaje de programación o herramienta, siempre que su resultado se pueda ejecutar en un PC, preferentemente bajo Windows.
Lenguaje JS--
Deben incluirse las características generales de JS--. 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:
- La estructura general de un programa compuesto por funciones y declaraciones.
- Definición de funciones.
- Tipos enteros, lógicos, cadenas y vacío.
- Variables y su declaración.
- Constantes enteras y cadenas de caracteres.
- Sentencias: asignación, condicional simple, llamada a funciones y retorno.
- Sentencias de entrada/salida por terminal.
- Expresiones.
- Comentarios.
- Operadores [al menos hay que implementar tres de ellos]:
- Aritméticos:
+
, -
, *
, /
, %
[al menos uno]
- Relacionales:
==
, !=
, <
, >
, <=
, >=
[al menos uno]
- Lógicos:
&&
, ||
, !
[al menos uno]
Parte específica de cada grupo:
- Comentarios:
- Comentario de bloque (
/* */
)
- Comentario de línea (
//
)
- Cadenas:
- Con comillas simples (
' '
)
- Con comillas dobles (
" "
)
- Sentencias:
- Sentencia condicional compuesta (
if
, if
-else
)
- Sentencia de selección múltiple (
switch
-case
)
- Sentencia repetitiva (
while
)
- Sentencia repetitiva (
do
-while
)
- Sentencia repetitiva (
for
)
- Operadores especiales:
- Pre-auto-incremento (
++
como prefijo)
- Post-auto-incremento (
++
como sufijo)
- Pre-auto-decremento (
--
como prefijo)
- Post-auto-decremento (
--
como sufijo)
- Asignación con suma (
+=
)
- Asignación con resta (
-=
)
- Asignación con multiplicación (
*=
)
- Asignación con división (
/=
)
- Asignación con resto (
%=
)
- Asignación con y lógico (
&=
)
- Asignación con o lógico (
|=
)
Técnicas de Análisis
Cada grupo tendrá un método de Análisis Sintáctico:
- Análisis Ascendente
- Análisis Descendente con tablas
- Análisis Descendente recursivo
Las opciones de la Práctica de construcción de un Traductor de JS-- asignadas a cada grupo son las que se asignaron en la asignatura de Procesadores de Lenguajes.