Program. Program ::= [Bind] ; Bind. Bind ::= Ident [Ident] "=" Exp ; EAnn. Exp5 ::= Exp5 ":" Type ; EId. Exp4 ::= Ident ; EConst. Exp4 ::= Const ; EApp. Exp3 ::= Exp3 Exp4 ; EAdd. Exp1 ::= Exp1 "+" Exp2 ; ELet. Exp ::= "let" Ident "=" Exp "in" Exp ; EAbs. Exp ::= "\\" Ident "." Exp ; CInt. Const ::= Integer ; CStr. Const ::= String ; TMono. Type1 ::= UIdent ; TPoly. Type1 ::= LIdent ; TArrow. Type ::= Type "->" Type1 ; token UIdent (upper (letter | digit | '_')*) ; token LIdent (lower (letter | digit | '_')*) ; separator Bind ";" ; separator Ident " "; coercions Type 1 ; coercions Exp 5 ; comment "--" ; comment "{-" "-}" ;