This assignment is largely the grammar from HW #8, plus forms similar to Figure 5.7 on page 180 in EoPL.
The total grammar, in summary, should be:
<program> |    ::=    | { <class-decl> }* <statement> |
<class-decl> |    ::=    | class <identifier> extends < identifier> { { field <identifier> ; }* { <method-decl> }* } |
<method-decl> |    ::=    | method <identifier> ( { <identifier> }*(,) ) { { <statement> ; }* return <expression > ; } |
<statement> |    ::=    | <identifier> = < expression> |
   |    | print <expression> | |
   |    | {{<statement>}*(;) } | |
   |    | if <expression> < statement> else <statement> | |
   |    | while <expression> <statement> | |
   |    | var <identifier> = <expression> ; <statement> | |
<expr> |    ::=    | <number> |
   |    | <identifier> | |
   |    | <boolean> | |
   |    | new <identifier> ( { <expression> }*(,) ) | |
   |    | send <expression> . < identifier> ( { <expression> }*(,) ) | |
   |    | super . < identifier> ( { <expression> }*(,) ) | |
   |    | ( lambda ( {<identifier>}* ) <expr> ) | |
   |    | ( if <expr> <expr> <expr> ) | |
   |    | ( cond { ( <expr> <expr> ) }* ( else <expr> ) ) | |
   |    | ( let ( { ( <id> <expr> ) }* ) <expr> ) | |
   |    | ( let* ( { ( <id> <expr> ) }* ) <expr> ) | |
   |    | ( letrec ( { ( <id> ( lambda ( { <id> }* ) <expr> ) }* ) <expr> ) | |
   |    | ( <expression> { <expression>}* ) |
With primitive operators add, sub, mul, div, mod, cons, car, cdr, list, empty-list, empty?, equal, lesser, greater, and, or, xor.
Modify your existing parse and execute functions to handle programs in the new language.
Notes: