Program idl -> decl_1 ... decl_n n >= 1
Declaration decl -> proc
| %const var [var_1, ... ,var_n] Constants, n >= 1
| %dis var var_1 ... var_n = dis n >= 0
| %prefix var Prefix to strip from Haskell function names
| %C var entire line is passed (stripped) to C
| %- var entire line is passed verbatim to C
Procedure proc -> sig [call] [ccode] [result]
Signature sig -> %fun var :: type Name and type
Type type -> var simple type
| var type type application
| type -> type function type
| (type_1, ... ,type_n) tuple types, n >= 0
| [type] list type
Call call -> %call dis_1 ... dis_n
Result result -> %fail cexp cexp [result] In I/O monad
| %result dis
C Expression cexp -> " var " string excludes " character
C Code ccode -> %code var