Solution (source code)

= Solution

Use an <abstract syntax tree> with the following constructors. Here `Expr` denotes the separate <abstract syntax tree> type for a <program expression>, `Name` identifies a <variable assignment> target, and the square brackets denote an ordered <list>.

``
Stmt = Assign(Name, Expr)
     | Seq(Stmt, Stmt)
     | Case(Expr, [(Expr, Stmt)])
``

The <list> in `Case` must be nonempty. Its first field is the controlling <program expression>; each pair contains a label <program expression> and the corresponding body. Keep the pairs in source order and keep repeated labels: this is an ordered search, with the first successful <equality> test choosing the body. A label is an <abstract syntax tree> for a <program expression>, not a previously evaluated <integer> or a key in a <map data structure>. Evaluating or reordering labels during <compilation> would change the specified <programming language semantics>.

`Seq(s,t)` executes `s` before `t`. The delimiters `begin` and `end` need no surviving constructor: the <parser> uses them to determine the <abstract syntax tree>'s grouping and then returns the enclosed tree. There are no declarations in these blocks that would require a separate binding environment. A <list> of statements could replace binary `Seq`; below we choose right-associated binary trees so that the <semantic actions> are precise.

\b[The essential representation is an ordered, nonempty list of expression/body pairs, together with assignment and sequencing nodes.] In constructor notation,
$$
\boxed{\operatorname{Case}(e,[(e_1,s_1),\ldots,(e_n,s_n)]),\quad n\geq 1.}
$$