Segundo Exercício-Programa: Interpretador Estendido
MAC0316/MAC5754 - Conceitos de Linguagens de Programação
O segundo exercício-programa é o Extended
Interpreter proposto por Sriram Krishnamurthy (o autor do
PLAI), com a modificação especificada abaixo.
Este EP deve ser feito individualmente. Entregue sua solução até o dia
13 16 de maio, pelo sistema Paca/Moodle.
Modificação em relação à proposta original
Na proposta
original de S. Krishnamurthy, a forma with
aparece tanto
na sintaxe concreta como na sintaxe abstrata da linguagem CFWAE. Como a
definição do tipo CFWAE
inclui uma variante with
,
essa proposta permite (mas não obriga) que um parser gere árvores
sintáticas contendo nós with
. Em outras palavras, o enunciado
original permite que você decida se o seu parser vai ou não vai gerar
árvores sintáticas contendo nós with
. Essa decisão separa as
possíveis soluções em duas categorias:
- Num tipo de solução, o parser traduz ocorrências concretas da
forma sintática
with
em nós with
da árvore
sintática.
- No outro tipo de solução, o parser converte ocorrências
concretas da forma sintática
with
em chamadas a funções
anônimas, da maneira descrita no PLAI e vista em classe. Cada ocorrência
da forma with
no programa concreto gera um nó
app
da árvore sintática. Neste tipo de solução, as árvores
sintáticas nunca conterão nós with
. Embora permitidos pela
sintaxe abstrata, tais nós não serão utilizados.
Na alternativa 2, o with
é apenas um modo conveniente ("acúcar
sintático") para representar uma chamada a uma função anônima. Essa
alternativa simplifica a implementação do interpretador, pois somente o
parser precisa lidar com a forma with
. Além disso,
considero que a alternativa 2 é a "mais educativa", pois ela mostra, de modo
bem concreto, que formas como a with
(ou como a forma
let
do Scheme) não são construções essenciais.
Em vez de deixar a seu critério a escolha entre os dois tipos de soluções
acima, resolvi especificar que deve ser implementada uma solução do tipo
2. É essa a diferença básica entre este exercício-programa e o proposto
por S. Krishnamurthy. Tudo o que segue é consequência dessa decisão.
Já que nossas árvores sintáticas nunca conterão nós with
, podemos
eliminar da sintaxe abstrata o tipo correspondente a esses nós, ou seja,
podemos remover a variante with
do define-type
para
CFWAE
. Podemos remover também a definição do tipo
Binding
, pois esse tipo aparece somente na variante
with
. Essas modificações devem ser aplicadas ao código que está
na seção Support Code do enunciado original. Em vez do modelo
especificado na seção Support Code, use o seguinte modelo de código
(sem fazer nenhuma alteração):
(define-type CFAE
[num (n number?)]
[binop (op procedure?) (lhs CFAE?) (rhs CFAE?)]
[id (name symbol?)]
[if0 (c CFAE?) (t CFAE?) (e CFAE?)]
[fun (args (listof symbol?)) (body CFAE?)]
[app (f CFAE?) (args (listof CFAE?))])
(define-type Env
[mtEnv]
[anEnv (name symbol?) (value CFAE-Value?) (env Env?)])
(define-type CFAE-Value
[numV (n number?)]
[closureV (params (listof symbol?))
(body CFAE?)
(env Env?)])
;; parse : expression -> CFAE
;; This procedure parses an expression into a CFAE
(define (parse sexp)
...)
;; interp : CFAE -> CFAE-Value
;; This procedure interprets the given CFAE and produces a result
;; in the form of a CFAE-Value (either a closureV or a numV)
(define (interp expr)
...)
Note que o tipo CFWAE
do modelo original foi renomeado para
CFAE
, já que o with
desapareceu da sintaxe
abstrata (embora continue presente na sintaxe concreta CFWAE). Agora a função
parse
recebe uma s-expression com uma expressão CFWAE e
devolve a instância do tipo CFAE
que é a raiz da árvore sintática
correspondente.
Na segunda parte do exercício-programa (avaliação preguiçosa), o tipo
CFAE-Value
deve conter uma variante exprV
:
(define-type CFAE-Value
[numV (n number?)]
[closureV (params (listof symbol?))
(body CFAE?)
(env Env?)]
[exprV (expr CFAE?) (env Env?)]))
O que deve ser entregue
Entregue um arquivo tar.gz ou zip que satisfaça os seguintes requisitos:
- O nome do arquivo deve ser da forma
ep2-<seu-número-USP>.tar.gz
ou
ep2-<seu-número-USP>.zip
.
Por exemplo: ep2-12345678.zip
.
- O desempacotamento do arquivo tar.gz ou zip deve produzir um
diretório com o mesmo nome do arquivo, menos o sufixo
.tar.gz
ou .zip
. (Exemplo:
ep2-12345678
.) Todos os arquivos desempacotados devem
estar dentro desse diretório.
- O diretório desempacotado deve conter:
- o seu arquivo
xinterp.ss
, com a primeira parte do
exercício-programa (avaliação ávida);
- o seu arquivo
xinterp-lazy.ss
, com a segunda parte do
exercício-programa (avaliação preguiçosa).
Last modified: Mon Apr 19 16:06:22 BRT 2010