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 |