Program. Program ::= [Def] ; DExp. Def ::= Ident ":" Type Ident [Ident] "=" Exp ";" ; separator Def ""; separator Ident ""; separator Type "->"; EId. Exp3 ::= Ident ; EInt. Exp3 ::= Integer ; EApp. Exp2 ::= Exp2 Exp3 ; EAdd. Exp1 ::= Exp1 "+" Exp2 ; ESub. Exp1 ::= Exp1 "-" Exp2 ; EMul. Exp2 ::= Exp2 "*" Exp3 ; EDiv. Exp2 ::= Exp2 "/" Exp3 ; EMod. Exp2 ::= Exp2 "%" Exp3 ; EAbs. Exp ::= "\\" Ident ":" Type "." Exp ; coercions Exp 3 ; TInt. Type1 ::= "Int" ; TPol. Type1 ::= Ident ; TFun. Type ::= Type "->" Type1; coercions Type 1 ; comment "--" ; comment "{-" "-}" ;