Program. Program ::= [Bind] ; Bind. Bind ::= Ident [Ident] "=" Exp ; EAnn. Exp5 ::= "(" Exp ":" 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 ::= "Mono" Ident ; TPoly. Type1 ::= "Poly" Ident ; TArrow. Type ::= Type1 "->" Type ; -- This doesn't seem to work so we'll have to live with ugly keywords for now -- token Upper (upper (letter | digit | '_')*) ; -- token Lower (lower (letter | digit | '_')*) ; separator Bind ";" ; separator Ident " "; coercions Type 1 ; coercions Exp 5 ; comment "--" ; comment "{-" "-}" ; -- Adt. Adt ::= "data" UIdent "=" [Constructor] ; -- Sum. Constructor ::= UIdent ; -- separator Constructor "|" ;