%{ open Expr %} %token PLUS TIMES %token TOP BOTTOM EXFALSO %token LPAREN RPAREN %token FUN ARR COLON %token VARID %token TYID %token EOL %start main %type main %% main: e=expression EOL { e } ty: | id=TYID { id } ty_annot: | id=VARID COLON t=ty { (id, t) } expression: | FUN LPAREN annot=ty_annot RPAREN ARR e=expression { Fun (annot, e) } | e=app_expr { e } app_expr: | e=app_expr a=atomic { App (e, a) } | a=atomic { a } atomic: | id=VARID { Var id } | LPAREN e=expression RPAREN { e }