prog := (tdef | func)* tdef := '::' id id* '=' tcons ';' tcons := id type* ('|' id type*)* type := 'Int' | 'Bool' | id id* | '(' type ')' func := funid id* '=' expr ';' funid := id | op ('ifxr' | 'ifxl') num expr := expr expr | expr op expr | num | 'True' | 'False' | '(' (expr | op) ')' | 'code'? id | '\\' id '.' expr num := (0 | 1 | .. | 9)* id := (a | b | .. | z | A | B | .. | Z)* op := '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '=' | '+' | '/' | '?' | '-' | '_' | '|' | ''' | '\' | '"' | '<' | '>' | '.' | ':'