Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| teaching:cc4101:tareas:xyz:tarea1a [2024/03/20 20:55] – fdiaz | teaching:cc4101:tareas:xyz:tarea1a [2024/03/26 16:09] (current) – [Tarea 1a (Entrega: 28 de marzo del 2024)] fdiaz | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Tarea 1a (Entrega: | + | ====== Tarea 1a (Entrega: |
| ==== Parsing de Lenguaje con Funciones top-level ==== | ==== Parsing de Lenguaje con Funciones top-level ==== | ||
| - | En esta primera parte de la tarea 1, implementaremos el parser para un lenguaje funcional con funciones top-level, tipos de datos básicos e identificadores locales (with). | + | En esta tarea, implementaremos el parser para un lenguaje funcional con funciones top-level, tipos de datos básicos e identificadores locales (with). Para hacer una aproximación más gradual al problema, dividiremos el desarrollo en un lenguaje core que luego extenderemos. |
| <note important> | <note important> | ||
| Line 12: | Line 12: | ||
| Deben desarrollar su tarea en base a los siguientes archivos: | Deben desarrollar su tarea en base a los siguientes archivos: | ||
| * '' | * '' | ||
| - | * '' | + | * '' |
| Deben entregar vía U-Cursos **un único archivo .zip** que contenga los archivos **t1a.rkt** y **t1a-test.rkt**. | Deben entregar vía U-Cursos **un único archivo .zip** que contenga los archivos **t1a.rkt** y **t1a-test.rkt**. | ||
| Line 18: | Line 18: | ||
| ---- | ---- | ||
| - | ==== Definición del Lenguaje ==== | ||
| - | En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, booleanos, y operadores simples), identificadores locales (with con una cantidad arbitraria de bindings), y definiciones de funciones top-level de múltiples argumentos. | + | ===== 1) Parser del Lenguaje Core [0.8 pts] ===== |
| + | |||
| + | En esta parte, vamos a implementar | ||
| El lenguaje con el que trabajaremos está definido por la siguiente gramática en BNF. | El lenguaje con el que trabajaremos está definido por la siguiente gramática en BNF. | ||
| Line 28: | Line 29: | ||
| < | < | ||
| - | |||
| - | < | ||
| - | |||
| - | < | ||
| < | < | ||
| | <id> | | <id> | ||
| - | | < | ||
| | {add1 < | | {add1 < | ||
| | {+ < | | {+ < | ||
| - | | {< < | + | | {- < |
| - | | {= < | + | |
| - | | {! < | + | |
| - | | {if < | + | |
| - | | {with {< | + | |
| | {<id> < | | {<id> < | ||
| - | |||
| </ | </ | ||
| Un programa está compuesto de 0 o más definiciones de funciones, además de una expresión final que sirve de punto de entrada (como el main en C y Java). Una definición de función incluye el nombre de la función, el nombre de los parámetros formales, y finalmente la expresión del cuerpo de la función. Las expresiones siguen la presentación estándar vista en clases. | Un programa está compuesto de 0 o más definiciones de funciones, además de una expresión final que sirve de punto de entrada (como el main en C y Java). Una definición de función incluye el nombre de la función, el nombre de los parámetros formales, y finalmente la expresión del cuerpo de la función. Las expresiones siguen la presentación estándar vista en clases. | ||
| - | Algunos ejemplos de programas válidos para este lenguaje pueden ser: | + | Algunos ejemplos de programas válidos para este lenguaje |
| <code scheme> | <code scheme> | ||
| - | { ;; Programa de Ejemplo 1 | + | { |
| - | {define {sum x y z} {+ x {+ y z}}} | + | |
| - | {with {{x 9} {y 10} {z 11}} | + | |
| - | | + | |
| } | } | ||
| - | { ;; Programa de Ejemplo 2 | + | { |
| - | {with {{x 5} {y 42} {z true}} | + | {define |
| - | z} | + | {add1 {sum -2 5 1}} |
| } | } | ||
| - | { ;; Programa de Ejemplo 3 | + | { |
| | | ||
| | | ||
| {add2 {triple 2}} | {add2 {triple 2}} | ||
| } | } | ||
| + | </ | ||
| - | { ;; Programa | + | Para esta parte, se proveen las definiciones de los tipos de datos que representan los nodos del AST y los tests necesarios para el lenguaje core. |
| - | {with {{x 3} {y {+ 1 2}}} | + | |
| - | | + | Para desarrollar el parser, dividiremos su implementación en las siguientes funciones: |
| + | - **[0.4 pts]** '' | ||
| + | - **[0.2 pts]** '' | ||
| + | - **[0.2 pts]** '' | ||
| + | |||
| + | **Observaciones importantes**: | ||
| + | * Cuando el BNF incluye un nodo con * (cero o más ocurrencias), | ||
| + | * Fíjese en los tests provistos para ver ejemplos de nodos construidos por las distintas funciones de parsing. | ||
| + | |||
| + | |||
| + | ===== 2) Parser del Lenguaje Extendido [1.2 pts] ===== | ||
| + | |||
| + | |||
| + | En esta parte, vamos a extender el lenguaje core con algunas primitivas extra (booleanos, y operadores booleanos simples), la expresión condicional '' | ||
| + | |||
| + | Las extensiones sintácticas del lenguaje se presentan en el siguiente BNF. | ||
| + | |||
| + | <code scheme> | ||
| + | ;; < | ||
| + | |||
| + | < | ||
| + | | < | ||
| + | | {< < | ||
| + | | {= < | ||
| + | | {! < | ||
| + | | {if < | ||
| + | | {with {< | ||
| + | |||
| + | < | ||
| + | </ | ||
| + | |||
| + | Algunos ejemplos | ||
| + | |||
| + | <code scheme> | ||
| + | { | ||
| + | | ||
| + | | ||
| + | {relu 42} | ||
| + | } | ||
| + | { | ||
| + | | ||
| + | {with {{x 9} {y 10} {z 11}} | ||
| + | {sum x y z} } | ||
| + | } | ||
| + | { | ||
| + | {with {{x 5} | ||
| + | {y 42} | ||
| + | {z #t}} | ||
| + | {if z | ||
| + | {add1 x} | ||
| + | {- y 2}}} | ||
| + | } | ||
| + | { | ||
| + | {with {{x 3} | ||
| + | | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| Line 76: | Line 121: | ||
| **Observaciones importantes**: | **Observaciones importantes**: | ||
| * Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, | * Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, | ||
| - | * Al definir | + | |
| - | | + | |
| + | | ||
| + | === Nuevos nodos para el AST === | ||
| + | - **[0.1 pts]** Defina el tipo '' | ||
| + | - **[0.2 pts]** Extienda el tipo de datos '' | ||
| - | ===== Parte 1: Definición del AST [0.5 pts] ===== | + | === Extender el Parser |
| - | En esta parte, definiremos los tipos de datos que representarán a los diversos nodos del AST de nuestro lenguaje. | + | - **[0.1 pts]** Implemente la función '' |
| - | Siguiendo | + | - **[0.4 pts]** Extienda |
| - | - **[0.1 pts]** El tipo '' | + | <note important> |
| - | | + | * Recuerde incluir tests para las funciones |
| - | - **[0.2 pts]** El tipo '' | + | </ |
| - | - **[0.1 pts]** | + | |
| - | ===== Parte 2: Implementación del Parser [1.5 pts] ===== | ||
| - | En esta parte, implementaremos el parser para nuestro lenguaje. Para poner en práctica la metodología del curso, dividiremos la implementación del parser en las siguientes funciones: | ||
| - | - **[0.2 pts]** '' | ||
| - | - **[0.2 pts]** '' | ||
| - | - **[0.8 pts]** '' | ||
| - | - **[0.3 pts]** '' | ||
| | | ||

