// -*- sugar -*- e: // term > Case: 'case' e 'of' '|'? e ++ '|' | If: 'if' e 'then' e 'else' e | Fun: 'fun' xt ++ ',' '.' e < App: e e < Prj: e '.' i = Atom: '(' e ')' | True: 'true' | False: 'false' | Prod: '<' e ** ',' '>' | Id: x ; t: // type > Tfun: t '->' t = Tatom: '(' t ')' | Tbool: 'bool' | Tprod: '<' t ** ',' '>' ; xt: x ':' t; // argument i: num; // integer x: id; // identifier