Tarea 3

Para esta tarea tiene que entregar 3 archivos, uno que contenga el código fuente de su tarea, un readme con las instrucciones para ejecutar su tarea, y los tests de su tarea. Los tests forman parte de su evaluación! Consulte las normas de entrega de tareas en http://pleiad.cl/teaching/cc4101.

En esta ocasión usted deberá implementar las funciones parse, interp y run usando su lenguaje NO funcional favorito, tal como Java o C. Independientemente del lenguaje que utilice, se mantienen las reglas de las tareas pasadas, es decir, todo método/función debe tener su comentario (firma + descripción) y test.

Si usted no entrega el código fuente de su tarea obtendrá la nota mínima, por ejemplo si implementa la tarea en java, debe entregar todos los .java necesarios.

Para clarificar, los lenguajes prohibidos son: Racket, Scheme, Lisp, Haskell, Scala, ML, OCaml, Coq, Idris, Agda, Rust y Erlang.

Su tarea recibirá un String como argumento y debe parsearlo, interpretarlo y retornar el resultado como un String.

A continuación se presenta, por partes, la gramática BNF del lenguaje a implementar (Números, Funciones, Secuencias y Set). La semántica del lenguaje debe ser la misma a la vista en clases, por ejemplo (ante la presencia de mutaciones) los argumentos de una suma se deben evaluar de izquierda a derecha.

Números (2pt)

<s-expr> ::= <num>
         | (+ <s-expr> <s-expr>)
         | (- <s-expr> <s-expr>)
         | (if0 <s-expr> <s-expr> <s-expr>)

Usted deberá definir lo siguiente:

  1. parser :: String -> Expr que parsea el lenguaje
  2. interp :: Expr x Env -> Val que evalúa un programa con semántica eager.
  3. run :: String -> String que toma un programa fuente y retorna la representación en String del valor resultante.

Al igual que en la tarea pasada, usted tiene total libertad en como implementar cada una de estas funciones.

Ejemplos con Java:

java tarea3 "4"
>"4"
java tarea3 "(+ 4 3)"
>"7"

Funciones (2pt)

Usted deberá extender su lenguaje con funciones de primera clase. Éstas deben tener régimen de evaluación eager y scope estático.

<s-expr> ::= ...
         | (with (<id> <s-expr>) <s-expr>)
         | <id>
         | (fun (<id>) <s-expr>)
         | (<s-expr> <s-expr>)

Estos son los mensajes de error que debe lanzar su tarea:

  1. “error: identificador libre!! x” que se lanza al encontrar con un identificador libre 'x'
  2. “error: expresión inválida expr” que se lanza al no poder interpretar 'expr', y ésta no es ni un número ni una función.

Ejemplos con Java:

java tarea3 "y"
>"error: identificador libre!! y"
java tarea3 "(fun (x) x)"
>"Function"

Ejemplos con C:

./Tarea3 "(8 10)"
>"error: expresión inválida (8 10)"
./Tarea3 "(((fun (x) x)
        (fun (x) (+ x 5)))
       3)"
>"8"
./Tarea3 "(with (x 3)
             (with (f (fun (y) (+ x y)))
                   (with (x 5)
                         (f 4))))"
>"7"

Note que los mensajes de error son un String, su tarea debe siempre retornar un String.

Secuencias y Set (2pt)

Usted deberá extender su lenguaje con secuencias y la capacidad de cambiar el valor de una variable. (Note que NO tiene que implementar cajas.)

<s-expr> ::= ...
         | (seqn <s-expr> <s-expr>)
         | (set <id> <s-expr>)

Ejemplo con Java:

java tarea3 "(with (x 3)
                 (+ (seqn (set x 5) x) x))"
>"10"