%{ open Ast %} %start whereexpr %token ID ATOM %token EQ OPENP CLOSEP WHERE AT BAR ARROW EOF %type <(string * Ast.term) list> input %type whereexpr %% input: defs { $1 } defs: { [] } | def defs { $1 :: $2 } ; def: ID EQ whereexpr { $1, $3 } | ID pats EQ whereexpr { $1, $4 } ; pats: primexpr { [] } | pats primexpr { $2 :: $1 } ; var: ID { TVar $1 }; atom: ATOM { TCons $1 }; whereexpr: atexpr WHERE def { $1 } | atexpr { $1 }; atexpr: altexpr AT altexpr { TApp ($3, $1) } | altexpr { $1 }; altexpr: lamexpr BAR altexpr { TAlt ($1, $3) } | lamexpr { $1 }; lamexpr: appexpr ARROW lamexpr { TLam ($1, $3) } | appexpr { $1 }; appexpr: appexpr primexpr { TApp ($1, $2) } | primexpr { $1 }; primexpr: var { $1 } | atom { $1 } | OPENP whereexpr CLOSEP { $2 } ;