Program. Program ::= [Def] ; DBind. Def ::= Bind ; DData. Def ::= Data ; separator Def ";" ; Bind. Bind ::= Ident ":" Type ";" Ident [Ident] "=" Exp ; Data. Data ::= "data" Constr "where" "{" [Constructor] "}" ; Constructor. Constructor ::= Ident ":" Type ; separator nonempty Constructor "" ; TMono. Type1 ::= "_" Ident ; TPol. Type1 ::= "'" Ident ; TConstr. Type1 ::= Constr ; TArr. Type ::= Type1 "->" Type ; Constr. Constr ::= Ident "(" [Type] ")" ; -- TODO: Move literal to its own thing since it's reused in Init as well. EAnn. Exp5 ::= "(" Exp ":" Type ")" ; EId. Exp4 ::= Ident ; ELit. Exp4 ::= Literal ; EApp. Exp3 ::= Exp3 Exp4 ; EAdd. Exp1 ::= Exp1 "+" Exp2 ; ESub. Exp1 ::= Exp1 "-" Exp2 ; ELet. Exp ::= "let" Ident "=" Exp "in" Exp ; EAbs. Exp ::= "\\" Ident "." Exp ; ECase. Exp ::= "case" Exp "of" "{" [Inj] "}"; LInt. Literal ::= Integer ; Inj. Inj ::= Init "=>" Exp ; separator nonempty Inj ";" ; InitLit. Init ::= Literal ; InitConstr. Init ::= Ident [Ident] ; InitCatch. Init ::= "_" ; separator Type " " ; coercions Type 2 ; separator Ident " "; coercions Exp 5 ; comment "--" ; comment "{-" "-}" ;