<program> := <statements> EOF

<statements> := <statement>
             |  <statement> SEP <statements>

<statement> := let <id> = <expr>
            |  <expr>

<expr> := if <expr> then <statements> end
       |  if <expr> then <statements> else <statements> end
       |  while <expr> SEP <statements> end
       |  <simple_expr>

<simple_expr> := <id>
              | <number>
              | <string>


/* actual grammar encoded in program */

<program> := <statements> EOF
<statements> := <statement> | <statement> SEP <statements>
<let_expression> := let <identifier> = <rhs>
<rhs> := <num_literal> | <str_literal> | <identifier>