[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / docs / Prefix_Form
diff --git a/ghc/docs/Prefix_Form b/ghc/docs/Prefix_Form
new file mode 100644 (file)
index 0000000..43daaba
--- /dev/null
@@ -0,0 +1,294 @@
+                       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