2.6 Rudimentary Interpreter
You must complete this assignment by yourself.
You must submit this in an archive named "rinterp.zip".
2.6.1 WAE
You must submit this in a file named "wae1.ss".
2.6.1.1 Datatypes
(define-type Binding |
[binding (name symbol?) (named-expr WAE?)]) |
(define-type WAE |
[num (n number?)] |
[add (lhs WAE?) (rhs WAE?)] |
[sub (lhs WAE?) (rhs WAE?)] |
[with (b Binding?) (body WAE?)] |
[id (name symbol?)]) |
This part requires no test cases.
2.6.1.2 Parser
Write the following function:
(parse s-exp) → WAE? |
s-exp : s-expression? |
WAE | = | number | ||
| | (+ WAE WAE) | |||
| | (- WAE WAE) | |||
| | (with ([id WAE]) WAE) | |||
| | id |
where number is a Scheme number and id is not '+, '-, or 'with.
The textbook provides a basic version for you.
(test (parse '5) (num 5)) |
(test/exn (parse true) "Illegal syntax") |
(test (parse '(+ 1 2)) (add (num 1) (num 2))) |
(test/exn (parse '(+ 1 2 3)) "More than two arguments") |
(test/exn (parse '(with [x 1] x)) "Not a list of bindings") |
2.6.1.3 Interpreter
Write the following function:
The textbook provides a basic version for you.
(test (calc (parse '5)) 5) |
(test (calc (parse '(+ 4 1))) 5) |
(test (calc (parse '(with ([x 5]) x))) 5) |
2.6.2 W*AE
You must submit this in a file named "wae2.ss".
2.6.2.1 Datatypes
(define-type Binding |
[binding (name symbol?) (named-expr WAE?)]) |
(define-type WAE |
[num (n number?)] |
[binop (op procedure?) |
(lhs WAE?) |
(rhs WAE?)] |
[with (lob (listof Binding?)) (body WAE?)] |
[id (name symbol?)]) |
This part requires no test cases.
2.6.2.2 Operator Table
Define a data-structure to contain a mapping from operator symbols to their definitions.
op-table : (listof (list/c symbol? (number? number? . -> . number?))) |
Populate it with mappings for '+, '-, '*, and '/.
Define a function that extracts the definition of an operator or false:
(lookup-op op) → (or/c procedure? false/c) |
op : symbol? |
You will find the Scheme function assoc useful.
2.6.2.3 Parser
Write the following function:
(parse s-exp) → WAE? |
s-exp : s-expression? |
WAE | = | number | ||
| | (+ WAE WAE) | |||
| | (- WAE WAE) | |||
| | (* WAE WAE) | |||
| | (/ WAE WAE) | |||
| | (with ([id WAE] ...) WAE) | |||
| | id |
where number is a Scheme number and id is not '+, '-, '*, '/, or 'with.
Your parser must call lookup-op.
(test (parse '(with ([x 1] [x 2]) (+ x x))) |
(with (list (binding 'x (num 1)) |
(binding 'x (num 2))) |
(binop + (id 'x) (id 'x)))) |
(test (parse '5) (num 5)) |
(test/exn (parse true) "Illegal syntax") |
(test (parse '(+ 1 2)) (add (num 1) (num 2))) |
(test/exn (parse '(+ 1 2 3)) "More than two arguments") |
(test/exn (parse '(with [x 1] x)) "Not a list of bindings") |
2.6.2.4 Multiple Substitution
Write the following function:
You will find calling your previous subst function useful.
(test (subst* (list (binding 'x (num 1))) (id 'x)) |
(num 1)) |
(test (subst* (list (binding 'x (num 1)) |
(binding 'y (id 'x))) |
(binop + (id 'x) (id 'y))) |
(binop + (num 1) (id 'x))) |
2.6.2.5 Interpreter
Write the following function:
You will find the functions ormap and symbol=? to detect errors like this.