-<Prog> ::= <FunDecl>+
+<Prog> ::= <LetDecl>*
+ <FunDecl>+
+<LetDecl> ::= 'Let' <type> <id> '=' <Expr> ';'
<FunDecl> ::= <id> '(' <Type>* ')' ['::' <FunType] '{' <VarDecl>* <Stmt>+ '}'
<FunType> ::= <VoidType> ['->' <FunType>]
| '(' <FunType> ')'
| 'return' [<Expr>] ';'
<VarDecl> ::= <Type> <id> '=' <Expr> ';'
<Expr> ::= <BinOrExpr> [':' <Expr>]
+ | <LambdaExpr>
<BinOrExpr> ::= <BinAndExpr> ['||' <BinOrExpr>]
<BinAndExpr> ::= <CompareExpr> ['&&' <BinAndExpr>]
<CompareExpr> ::= <PlusMinExpr> [('==' | '<' | '>' | '<=' | '>=' | '!=') <CompareExpr>]
| '[]' <Expr>
| '(' <Expr> ',' <Expr> ')'
| '"' <char> '"'
+<LamdaExpr> ::= '\'<id>+ '->' <Expr>
<FieldSels> ::= ('.' ('hd'|'tl'|'fst'|'snd))*
<FunCall> ::= <id> ['(' <ActArgs>+ ')']
<ActArgs> ::= <Expr> [',' ActArgs]