3 <LetDecl> ::= 'let' <type> <id> '=' <Expr> ';'
4 <FunDecl> ::= <id> '(' <Type>* ')' ['::' <FunType] '{' <VarDecl>* <Stmt>+ '}'
5 <FunType> ::= <VoidType> ['->' <FunType>]
7 <Stmt> ::= 'if' '(' <Expr> ')' '{' <Stmt>* '}' ['else' '{' <Stmt>* '}']
8 | 'while' '(' <Expr> ')' '{' <Stmt>* '}'
9 | <id> <FieldSels> '=' <Expr> ';'
11 | 'return' [<Expr>] ';'
12 <VarDecl> ::= <Type> <id> '=' <Expr> ';'
13 <Expr> ::= <BinOrExpr> [':' <Expr>]
15 <BinOrExpr> ::= <BinAndExpr> ['||' <BinOrExpr>]
16 <BinAndExpr> ::= <CompareExpr> ['&&' <BinAndExpr>]
17 <CompareExpr> ::= <PlusMinExpr> [('==' | '<' | '>' | '<=' | '>=' | '!=') <CompareExpr>]
18 <PlusMinExpr> ::= <TimesDivExpr> (('+' | '-') <TimesDivExpr>)*
19 <TimesDivExpr> ::= <BasicExpr> (['*' | '/' | '%'] <BasicExpr>)*
20 <BasicExpr> ::= <Op1> <Expr>
26 | <FunCall> <FieldSels>
28 | '[' (<Expr> ',')* (<Expr>) ']'
29 | '(' <Expr> ',' <Expr> ')'
32 <LamdaExpr> ::= '\'<id>* '->' <Expr>
33 <FieldSels> ::= ('.' ('hd'|'tl'|'fst'|'snd))*
34 <FunCall> ::= <id> ['(' <ActArgs>+ ')']
35 <ActArgs> ::= <Expr> [',' ActArgs]
39 | '(' Type ',' Type ')'
42 <VoidType> ::= 'Void' | Type