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 "{-" "-}";