--- /dev/null
+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 := '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '=' | '+' | '/' | '?'
+ | '-' | '_' | '|' | ''' | '\' | '"' | '<' | '>' | '.' | ':'