Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:xyz:tarea1a [2024/03/20 21:46] – [Parte 2: Parser del Lenguaje Extendido con booleanos, if y with [1.2 pts]] fdiazteaching: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: 28 de marzo del 2024) ======+====== Tarea 1a (Entrega: Miércoles 3 de abril del 2024) ======
  
 ==== 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:
   * ''{{ :teaching:cc4101:tareas:2024-1:t1a.rkt |t1a.rkt}}'': Aquí deberán implementar todas las funcionalidades pedidas en cada pregunta.   * ''{{ :teaching:cc4101:tareas:2024-1:t1a.rkt |t1a.rkt}}'': Aquí deberán implementar todas las funcionalidades pedidas en cada pregunta.
-  * ''{{ :teaching:cc4101:tareas:2024-1:t1a-test.rkt |t1a-test.rkt}}'': Aquí deberán escribir los tests para las funciones desarrolladas.+  * ''{{ :teaching:cc4101:tareas:2024-1:t1a-test.rkt |t1a-test.rkt}}'': Aquí se le proveen tests iniciales para el lenguaje core, y deberán añadir nuevos tests para las funciones desarrolladas o extendidas.
  
 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 19: Line 19:
  
  
-===== Parte 1Parser del Lenguaje Core [0.8 pts] =====+===== 1Parser del Lenguaje Core [0.8 pts] =====
  
-En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, y operadores simples), y definiciones de funciones top-level de múltiples argumentos. +En esta parte, vamos a implementar el parser para un lenguaje que incluye primitivas útiles (números, y operadores simples), y definiciones de funciones top-level de múltiples argumentos. 
  
 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 57: Line 57:
 </code> </code>
  
-Para esta parte, se proveen las definiciones de los tipos de datos que representan los nodos del AST y los test necesarios para el lenguaje core.+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 de nuestro lenguaje core, dividiremos su implementación en las siguientes funciones:+Para desarrollar el parser, dividiremos su implementación en las siguientes funciones:
   - **[0.4 pts]** ''parse-expr'' que recibe una s-expression y retorna un nodo ''Expr''.   - **[0.4 pts]** ''parse-expr'' que recibe una s-expression y retorna un nodo ''Expr''.
   - **[0.2 pts]** ''parse-fundef'' que recibe una s-expression y retorna un nodo ''Fundef''.   - **[0.2 pts]** ''parse-fundef'' que recibe una s-expression y retorna un nodo ''Fundef''.
Line 65: Line 65:
  
 **Observaciones importantes**: **Observaciones importantes**:
-  * Cuando el BNF incluye un nodo con * (cero o más ocurrencias), pueden usar ''map'' para procesar los elementos.+  * Cuando el BNF incluye un nodo con * (cero o más ocurrencias), el nodo del AST correspondiente lleva una lista de los elementos. Luego, pueden usar ''map'' para procesar esos elementos
 +  * Fíjese en los tests provistos para ver ejemplos de nodos construidos por las distintas funciones de parsing.
  
  
-===== Parte 2Parser del Lenguaje Extendido con booleanos, if y with [1.2 pts] =====+===== 2Parser 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 ''if'', e identificadores locales (''with'' con una cantidad arbitraria de bindings).  En esta parte, vamos a extender el lenguaje core con algunas primitivas extra (booleanos, y operadores booleanos simples), la expresión condicional ''if'', e identificadores locales (''with'' con una cantidad arbitraria de bindings). 
Line 86: Line 88:
  
 <binding> ::= (<id> <expr>) <binding> ::= (<id> <expr>)
- 
-<bool> ::= #t | #f 
 </code> </code>
  
Line 94: Line 94:
 <code scheme> <code scheme>
 { {
-   {define {geq x y} {! {< x y}}} +   {define {>= x y} {! {< x y}}} 
-   {define {relu x} {if {geq x 0} x 0}}+   {define {relu x} {if {>= x 0} x 0}}
    {relu 42}    {relu 42}
 } }
Line 106: Line 106:
    {with {{x 5}    {with {{x 5}
           {y 42}           {y 42}
-          {z true}} +          {z #t}} 
-       z}+       {if z 
 +           {add1 x} 
 +           {- y 2}}}
 } }
 { {
Line 119: Line 121:
 **Observaciones importantes**: **Observaciones importantes**:
   * Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, expresiones, etc.   * Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, expresiones, etc.
-  * Al definir el nombre de los constructores del lenguaje, verifique que no corresponda con uno ya utilizado por algún procedimiento de Racket. +  * Puede incluir los booleanos de una manera similar a como se introducen los números, reutilizando los booleanos de Racket. 
-  * Recuerde que incluir tests por cada función, con cobertura de todos los casos relevantes, es parte de la metodología de programación, y se considerará en la evaluación.+  * Al definir los nombres de los constructores del lenguaje, verifique que no sean ya utilizados por Racket, para evitar confusiones
 +  
  
 +=== Nuevos nodos para el AST ===
 +  - **[0.1 pts]** Defina el tipo ''Binding'' que corresponde al nodo ''<binding>'' en el BNF, que representa la asociación entre un identificador y una expresión.
 +  - **[0.2 pts]** Extienda el tipo de datos ''Expr'' con nuevos constructores para las expresiones que se añadieron al lenguaje.
  
-===== Parte 1: Definición del AST [0.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.pts]** Implemente la función ''parse-binding'' que recibe una s-expression y retorna un nodo ''Binding''
-Siguiendo la gramática presentada anteriormente, defina lo siguiente:+  - **[0.4 pts]** Extienda la función ''parse-expr'' con casos para las nuevas expresiones.
  
-  - **[0.1 pts]** El tipo ''Fundef'' que representa a la definición de una función top-level. +<note important> 
-   +  * Recuerde incluir tests para las funciones ''parse-binding'' ''parse-expr'', con cobertura de todos los casos relevantes, pues se considerará en la evaluación **[0.pts]**. 
-  - **[0.2 pts]*El tipo ''Expr'' que representa a una expresión del lenguaje. +</note>
-  **[0.1 pts]** El tipo ''Prog'' que representa a un programa. +
- +
-   +
-  - **[0.1 pts]** El tipo ''Binding'' que representa la asociación entre un identificador y un valor. +
-  - **[0.pts]** ''parse-binding'' que recibe una s-expression y retorna un nodo ''Binding''.+