<program> := <statements> EOF

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

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

<fn_block> := fn <id> ( <arg_list> ) <statements> end

<arg_list> := e
           | <id>
           | <id> , <arg_list>

<expr> := if <expr> then <statements> end
       |  if <expr> then <statements> else <statements> end
       |  while <expr> SEP <statements> end
       |  ( <expr> )
       |  <binop>

<binop> := <simple_expr>
        |  <simple_expr> <id> <binop>

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