<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>