--- /dev/null
+ Haskell Prefix Form
+ ===================
+
+This defines the interface between the Haskell lexer/parser "hsp"
+(written in lex/yacc/C) and the Haskell compiler proper, "hsc"
+(written in Haskell).
+
+White space in the form of spaces, tabs and newlines may occur between
+prefix items (I wouldn't recommend it [WDP]). A literal tab
+terminates a string constant (and by extension also an integer
+constant, character constant, identifier or infix operator).
+
+There is a general list form, where L indicates a Cons node and N
+indicates Nil. Elements in a list may be of arbitrary type.
+
+KH, 22/08/91: Changed for Haskell 1.1+ -- this is where Haskell and LML
+ finally part company...
+
+JH, 09/07/92: {0,5,6,I,O,u,v,w} Used in Data Parallel Haskell variant
+ (Jonathan Hill, QMW)
+
+WDP, 02/04/93: Added full-blown pragmas.
+WDP, 15/08/93: Added even more full-blown pragmas.
+
+`Tag' namespace already used:
+
+#$%()+,-.012356789:=>@ABCDEGILMNOPQRSTUWXZ_abcdefghijklmnopstuvwxyz~
+
+ Meta-Syntactic Items
+ --------------------
+
+Lists (l)
+---------
+
+L el l List constructor el : l
+N Null List []
+
+
+Strings (s)
+-----------
+
+#chars<TAB> String of characters before <TAB>
+
+
+
+
+ Syntactic Items
+ ---------------
+
+Expressions or Patterns (e or p)
+--------------------------------
+
+M L s s b [op] [ix] [ei]
+ Haskell module:
+ (name, file, binding, fixities, imports, exports)
+
+4 s Integer Constant 0, 1, ...
+H s Unboxed Integer constant 0#, 1#, ... /* WDP */
+F s Floating Point Constant 0.1, 0.2e-3, ...
+J s Unboxed Double Constant 0.1##, 0.2e-3##, ... /* WDP */
+K s Unboxed Float Constant 0.1#, 0.2e-3#, ... /* WDP */
+C s Character Constant '...'
+P s Unboxed character constant ???????? /* WDP */
+S s String Constant "..."
+V s String# Constant "..."# /* WDP */
+Y s "Literal C" Constant ``printf'' /* WDP */
+I s "no rep" Integer (unfoldings)
+R s s "no rep" Rational (numerator, denominator)
+s s "no rep" String constant (unfoldings)
+
+i id Identifiers
+C literal Literal constant
+
+a e1 e2 Function application (e1 e2)
+@ e1 id e2 Infix Application e1 `op` e2
+( e id Left section (e op)
+) id e Right Section (op e)
+
+l L [p] e Lambda Expressions \ p1 ... pn -> e
+c e [pb] Case Expression case e of pb1 ... pbn
+b e1 e2 e3 If expression if e1 then e2 else e3
+E b e Let Expression let b in e
+
+: [e] Explicit List [ e1, ..., en ]
+Z e [q] List Comprehension [ e | q ]
+. e1 [e2] [e3] Enumeration (e2/e3 may be []) [e1,e2..e3]
+
+, [e] Explicit Tuple ( e1, ..., en )
+
+R e t Type Constraint e :: t
+
+- e Negation - e
+
+j id s [e] C Call/Asm (ccall/asm id/str e1 ... en)
+ s == "n" --> ccall, non-ptrs only
+ s == "p" --> ccall, ptrs allowed
+ s == "N" --> casm, non-ptrs only
+ s == "P" --> casm, ptrs allowed
+k s e Set Cost Centre (scc s e)
+
+s id p As Pattern id @ p
+~ p Irrefutable Pattern ~ p
++ p e Plus Pattern n + k
+ /*WDP: why a "p" on the plus pat? (KH: historical reasons) */
+_ Wildcard Pattern _
+
+
+
+Qualifiers (q)
+--------------
+
+G p e Generator p <- e
+g e Guard e
+
+Bindings (b)
+------------
+
+t L C [id] t [d] iprag DataType Binding data C => t = d1 | ... | dn
+ deriving (id1, ..., idm)
+n L t1 t2 iprag Type Synonym type t1 = t2
+p L [pb] Pattern Binding pb1 ; ... ; pbn
+f L [pb] Function Binding pb1 ; ... ; pbn
+A b1 b2 Multiple Definitions b1 ; b2
+$ L C t b iprag Class class C => t [where b]
+% L C id t b iprag Instance instance C => id t [where b]
+D L [ty] Default default (ty1, ..., tyn)
+
+St L [id] t iprag Type Signature id1, ...., idn :: t
+Ss L id [t] Pragma: value specialis'ns {-# SPECIALISE id :: t1, ... tn #-}
+SS L id t Pragma: instance specialis'n {-# SPECIALISE instance id t #-}
+Si L id [id] Pragma: inline -- id [howto] {-# INLINE id [id]{0,1} #-}
+Su L id Pragma: magic unfolding {-# MAGIC_UNFOLDING id #-}
+Sa L id Pragma: abstract synonym {-# ABSTRACT id #-}
+
+7 L id [ei] [rn] Import module (Interface only) import id (eis) renaming rn
+B null binding
+
+
+Fixity declarations (op)
+--------------
+/* WDP: most suspicious how these don't appear in interfaces */
+/* WDP: need line numbers? */
+
+ s1 s2 s3 s1 is the operator name
+ s2 is either "infix", "infixl" or "infixr"
+ s3 is the precedence
+
+Types (t)
+---------
+
+T id [t] Type Constructor id t1 ... tn
+: t Explicit List Type [t]
+, [t] Explicit Tuple Type (t1, ..., tn)
+> t1 t2 Explicit Function Type t1 -> t2
+y id Type Variable id
+3 C t Type Context C => t
+
+2A id t "UniDict": class, type (core unfoldings only)
+2B id "UniTyVarTemplate"
+2C [id] t "UniForall" tv1 ... tvN => type
+
+2D Nothing (Maybe UniType)
+2E t Just t (ditto)
+
+Contexts (C)
+------------
+
+ [t] Haskell context: t1, ..., tn
+
+
+Data Types (d)
+--------------
+
+1 L id [t] Data constructor id st1 ... stn
+
+
+Pattern Bindings (pb)
+---------------------
+
+W L id p [ge] b Single grhs p | g1 = e1 ... where b
+ (L,id) = (Line,Function)
+
+
+Guarded Expressions (ge)
+------------------------
+
+ g e g | e (unguarded comes in with an
+ unsavoury (Var "_otherwise") `guard')
+
+
+Identifiers (id)
+----------------
+
+ s An identifier is just a string
+
+
+Import declarations (ix)
+------------------------
+
+e L s id [ei] [rn] b Line, File Name, Module name, imported entities,
+ renamings, interface body
+h L s id [ei] [rn] b Hiding clause, as above...
+
+
+Renamings (rn)
+--------------
+
+ id id From name, to name
+
+
+Exported/Imported Identifers (ei)
+---------------------------------
+
+x id ExImport Variable
+X id ExImport Constructor/Type/Class
+z id ExImport Class/Type plus all ops/cons
+8 id [id] ExImport Type(C1,..Cn)
+9 id [id] ExImport Class(o1,..on)
+m id Export Module
+
+
+Interface pragmas (iprag)
+-------------------------
+
+ User pragmas come in as "signatures"; see Bindings.
+
+PN Null/empty pragma
+
+Pd [d] Data pragma: otherwise-hidden data constructors
+Pt Type pragma: synonym is *abstract*
+Pc [gprag] Class pragma: one gprag per superclass
+Po gprag gprag Class op pragma: gprags for dsel & defm
+ OUT: Pv gprag [2prag] Value pragma: gprag + specialisations
+Pis id gprag Instance pragma (simple): id is module name, gprag for dfun
+Pic id gprag [1prag] Ditto (constant methods): also gprags for classops
+PiS id gprag [3prag] Ditto (specialised): also (type, instance-prag) pairs
+
+Pg Aprag uprag Sprag Uprag
+ General ("gprag"): arity, update, strictness, unfolding
+
+PA id Arity ("Aprag"): arity
+Pu id Update ("uprag"): update spec
+PS id gprag Strictness ("Sprag"): strictness spec, gprag for worker
+PM id id Magic unfolding ("Uprag"): var, magic-name string
+PU id core Unfolding ("Uprag"): "guidance", corexpr-unfolding
+
+Px Unfold always (these are "guidance" ones...)
+Py id id Unfold if applied to "m" ty args, "n" val args
+Pz id id Unfold if applied to "m" ty args, & cons in marked val positions
+ (e.g., "CXXCXX" ==> in 1st & 4th arg positions)
+
+P1 id gprag ("1prag"): (name, gen-pragma) pair
+P2 t gprag ("2prag"): (type, gen-pragma) pair
+P3 t gprag [iprag] ("3prag"): (type, [(gen-pragma, instance-pragma)]) pair
+
+
+Core syntax [in iprags] (core)
+------------------------------
+
+Fa
+Fb
+<etc -- lots of this stuff>
+
+Used in Data Parallel Haskell variant (Jonathan Hill, QMW)
+----------------------------------------------------------
+
+ ** Expressions **
+
+5 e [parqual] Parallel ZF expression << e | [parquals] >>
+6 [e] Pod Literal << e1,...,ek>>
+O [e] e Processor (|e1,...,ek;e|)
+
+ ** Types **
+
+u [t] t Explicit Processor Type (|t1,..tn;t|)
+v [t] Explicit Pod Type <<t>>
+
+ ** Parallel Qualifiers **
+
+0 e e Drawn From Generator exp <<- exp
+w e e Indexed From Generator exp <<= exp
+I e Guard
+
+
+ Other Items
+ -----------
+
+Line Numbers (L)
+----------------
+
+ s Haskell line number
+
+
+Kevin Hammond @ 22nd. August 1991