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:56] – [Definición del Lenguaje] 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> | ||
{ | { | ||
- | {define {sum x y z} {+ x {+ y z}}} | + | |
- | {with {{x 9} {y 10} {z 11}} | + | |
- | | + | |
} | } | ||
{ | { | ||
- | {with {{x 5} {y 42} {z true}} | + | {define |
- | z} | + | {add1 {sum -2 5 1}} |
} | } | ||
{ | { | ||
Line 66: | Line 55: | ||
{add2 {triple 2}} | {add2 {triple 2}} | ||
} | } | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | 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 de programas válidos para este lenguaje extendido pueden ser: | ||
+ | |||
+ | <code scheme> | ||
{ | { | ||
- | {with {{x 3} {y {+ 1 2}}} | + | {define {>= x y} {! {< x y}}} |
- | | + | |
+ | {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 75: | 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]** '' | ||
| |