add some {-# LANGUAGE BangPatterns #-} to mollify GHC
[ghc-hetmet.git] / compiler / parser / Parser.y.pp
1 --                                                              -*-haskell-*-
2 -- ---------------------------------------------------------------------------
3 -- (c) The University of Glasgow 1997-2003
4 ---
5 -- The GHC grammar.
6 --
7 -- Author(s): Simon Marlow, Sven Panne 1997, 1998, 1999
8 -- ---------------------------------------------------------------------------
9
10 {
11 {-# LANGUAGE BangPatterns #-} -- required for versions of Happy before 1.18.6
12 {-# OPTIONS -Wwarn -w -XNoMonomorphismRestriction #-}
13 -- The NoMonomorphismRestriction deals with a Happy infelicity
14 --    With OutsideIn's more conservativ monomorphism restriction
15 --    we aren't generalising
16 --        notHappyAtAll = error "urk"
17 --    which is terrible.  Switching off the restriction allows
18 --    the generalisation.  Better would be to make Happy generate
19 --    an appropriate signature.
20
21 -- The above warning supression flag is a temporary kludge.
22 -- While working on this module you are encouraged to remove it and fix
23 -- any warnings in the module. See
24 --     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
25 -- for details
26
27 {-# OPTIONS_GHC -O0 -fno-ignore-interface-pragmas #-}
28 {-
29 Careful optimisation of the parser: we don't want to throw everything
30 at it, because that takes too long and doesn't buy much, but we do want
31 to inline certain key external functions, so we instruct GHC not to
32 throw away inlinings as it would normally do in -O0 mode.
33 -}
34
35 module Parser ( parseModule, parseStmt, parseIdentifier, parseType,
36                 parseHeader ) where
37
38 import HsSyn
39 import RdrHsSyn
40 import HscTypes         ( IsBootInterface, WarningTxt(..) )
41 import Lexer
42 import RdrName
43 import TysWiredIn       ( unitTyCon, unitDataCon, tupleTyCon, tupleCon, nilDataCon,
44                           unboxedSingletonTyCon, unboxedSingletonDataCon,
45                           listTyCon_RDR, parrTyCon_RDR, consDataCon_RDR )
46 import Type             ( funTyCon )
47 import ForeignCall      ( Safety(..), CExportSpec(..), CLabelString,
48                           CCallConv(..), CCallTarget(..), defaultCCallConv
49                         )
50 import OccName          ( varName, dataName, tcClsName, tvName )
51 import DataCon          ( DataCon, dataConName )
52 import SrcLoc           ( Located(..), unLoc, getLoc, noLoc, combineSrcSpans,
53                           SrcSpan, combineLocs, srcLocFile, 
54                           mkSrcLoc, mkSrcSpan )
55 import Module
56 import StaticFlags      ( opt_SccProfilingOn, opt_Hpc )
57 import Type             ( Kind, liftedTypeKind, unliftedTypeKind )
58 import Coercion         ( mkArrowKind )
59 import Class            ( FunDep )
60 import BasicTypes
61 import DynFlags
62 import OrdList
63 import HaddockUtils
64
65 import FastString
66 import Maybes           ( orElse )
67 import Outputable
68
69 import Control.Monad    ( unless )
70 import GHC.Exts
71 import Data.Char
72 import Control.Monad    ( mplus )
73 }
74
75 {-
76 -----------------------------------------------------------------------------
77 24 Februar 2006
78
79 Conflicts: 33 shift/reduce
80            1 reduce/reduce
81
82 The reduce/reduce conflict is weird.  It's between tyconsym and consym, and I
83 would think the two should never occur in the same context.
84
85   -=chak
86
87 -----------------------------------------------------------------------------
88 31 December 2006
89
90 Conflicts: 34 shift/reduce
91            1 reduce/reduce
92
93 The reduce/reduce conflict is weird.  It's between tyconsym and consym, and I
94 would think the two should never occur in the same context.
95
96   -=chak
97
98 -----------------------------------------------------------------------------
99 6 December 2006
100
101 Conflicts: 32 shift/reduce
102            1 reduce/reduce
103
104 The reduce/reduce conflict is weird.  It's between tyconsym and consym, and I
105 would think the two should never occur in the same context.
106
107   -=chak
108
109 -----------------------------------------------------------------------------
110 26 July 2006
111
112 Conflicts: 37 shift/reduce
113            1 reduce/reduce
114
115 The reduce/reduce conflict is weird.  It's between tyconsym and consym, and I
116 would think the two should never occur in the same context.
117
118   -=chak
119
120 -----------------------------------------------------------------------------
121 Conflicts: 38 shift/reduce (1.25)
122
123 10 for abiguity in 'if x then y else z + 1'             [State 178]
124         (shift parses as 'if x then y else (z + 1)', as per longest-parse rule)
125         10 because op might be: : - ! * . `x` VARSYM CONSYM QVARSYM QCONSYM
126
127 1 for ambiguity in 'if x then y else z :: T'            [State 178]
128         (shift parses as 'if x then y else (z :: T)', as per longest-parse rule)
129
130 4 for ambiguity in 'if x then y else z -< e'            [State 178]
131         (shift parses as 'if x then y else (z -< T)', as per longest-parse rule)
132         There are four such operators: -<, >-, -<<, >>-
133
134
135 2 for ambiguity in 'case v of { x :: T -> T ... } '     [States 11, 253]
136         Which of these two is intended?
137           case v of
138             (x::T) -> T         -- Rhs is T
139     or
140           case v of
141             (x::T -> T) -> ..   -- Rhs is ...
142
143 10 for ambiguity in 'e :: a `b` c'.  Does this mean     [States 11, 253]
144         (e::a) `b` c, or 
145         (e :: (a `b` c))
146     As well as `b` we can have !, VARSYM, QCONSYM, and CONSYM, hence 5 cases
147     Same duplication between states 11 and 253 as the previous case
148
149 1 for ambiguity in 'let ?x ...'                         [State 329]
150         the parser can't tell whether the ?x is the lhs of a normal binding or
151         an implicit binding.  Fortunately resolving as shift gives it the only
152         sensible meaning, namely the lhs of an implicit binding.
153
154 1 for ambiguity in '{-# RULES "name" [ ... #-}          [State 382]
155         we don't know whether the '[' starts the activation or not: it
156         might be the start of the declaration with the activation being
157         empty.  --SDM 1/4/2002
158
159 1 for ambiguity in '{-# RULES "name" forall = ... #-}'  [State 474]
160         since 'forall' is a valid variable name, we don't know whether
161         to treat a forall on the input as the beginning of a quantifier
162         or the beginning of the rule itself.  Resolving to shift means
163         it's always treated as a quantifier, hence the above is disallowed.
164         This saves explicitly defining a grammar for the rule lhs that
165         doesn't include 'forall'.
166
167 1 for ambiguity when the source file starts with "-- | doc". We need another
168   token of lookahead to determine if a top declaration or the 'module' keyword
169   follows. Shift parses as if the 'module' keyword follows.   
170
171 -- ---------------------------------------------------------------------------
172 -- Adding location info
173
174 This is done in a stylised way using the three macros below, L0, L1
175 and LL.  Each of these macros can be thought of as having type
176
177    L0, L1, LL :: a -> Located a
178
179 They each add a SrcSpan to their argument.
180
181    L0   adds 'noSrcSpan', used for empty productions
182      -- This doesn't seem to work anymore -=chak
183
184    L1   for a production with a single token on the lhs.  Grabs the SrcSpan
185         from that token.
186
187    LL   for a production with >1 token on the lhs.  Makes up a SrcSpan from
188         the first and last tokens.
189
190 These suffice for the majority of cases.  However, we must be
191 especially careful with empty productions: LL won't work if the first
192 or last token on the lhs can represent an empty span.  In these cases,
193 we have to calculate the span using more of the tokens from the lhs, eg.
194
195         | 'newtype' tycl_hdr '=' newconstr deriving
196                 { L (comb3 $1 $4 $5)
197                     (mkTyData NewType (unLoc $2) [$4] (unLoc $5)) }
198
199 We provide comb3 and comb4 functions which are useful in such cases.
200
201 Be careful: there's no checking that you actually got this right, the
202 only symptom will be that the SrcSpans of your syntax will be
203 incorrect.
204
205 /*
206  * We must expand these macros *before* running Happy, which is why this file is
207  * Parser.y.pp rather than just Parser.y - we run the C pre-processor first.
208  */
209 #define L0   L noSrcSpan
210 #define L1   sL (getLoc $1)
211 #define LL   sL (comb2 $1 $>)
212
213 -- -----------------------------------------------------------------------------
214
215 -}
216
217 %token
218  '_'            { L _ ITunderscore }            -- Haskell keywords
219  'as'           { L _ ITas }
220  'case'         { L _ ITcase }          
221  'class'        { L _ ITclass } 
222  'data'         { L _ ITdata } 
223  'default'      { L _ ITdefault }
224  'deriving'     { L _ ITderiving }
225  'do'           { L _ ITdo }
226  'else'         { L _ ITelse }
227  'hiding'       { L _ IThiding }
228  'if'           { L _ ITif }
229  'import'       { L _ ITimport }
230  'in'           { L _ ITin }
231  'infix'        { L _ ITinfix }
232  'infixl'       { L _ ITinfixl }
233  'infixr'       { L _ ITinfixr }
234  'instance'     { L _ ITinstance }
235  'let'          { L _ ITlet }
236  'module'       { L _ ITmodule }
237  'newtype'      { L _ ITnewtype }
238  'of'           { L _ ITof }
239  'qualified'    { L _ ITqualified }
240  'then'         { L _ ITthen }
241  'type'         { L _ ITtype }
242  'where'        { L _ ITwhere }
243  '_scc_'        { L _ ITscc }         -- ToDo: remove
244
245  'forall'       { L _ ITforall }                -- GHC extension keywords
246  'foreign'      { L _ ITforeign }
247  'export'       { L _ ITexport }
248  'label'        { L _ ITlabel } 
249  'dynamic'      { L _ ITdynamic }
250  'safe'         { L _ ITsafe }
251  'threadsafe'   { L _ ITthreadsafe }  -- ToDo: remove deprecated alias
252  'interruptible' { L _ ITinterruptible }
253  'unsafe'       { L _ ITunsafe }
254  'mdo'          { L _ ITmdo }
255  'family'       { L _ ITfamily }
256  'stdcall'      { L _ ITstdcallconv }
257  'ccall'        { L _ ITccallconv }
258  'prim'         { L _ ITprimcallconv }
259  'proc'         { L _ ITproc }          -- for arrow notation extension
260  'rec'          { L _ ITrec }           -- for arrow notation extension
261  'group'    { L _ ITgroup }     -- for list transform extension
262  'by'       { L _ ITby }        -- for list transform extension
263  'using'    { L _ ITusing }     -- for list transform extension
264
265  '{-# INLINE'             { L _ (ITinline_prag _ _) }
266  '{-# SPECIALISE'         { L _ ITspec_prag }
267  '{-# SPECIALISE_INLINE'  { L _ (ITspec_inline_prag _) }
268  '{-# SOURCE'      { L _ ITsource_prag }
269  '{-# RULES'       { L _ ITrules_prag }
270  '{-# CORE'        { L _ ITcore_prag }              -- hdaume: annotated core
271  '{-# SCC'         { L _ ITscc_prag }
272  '{-# GENERATED'   { L _ ITgenerated_prag }
273  '{-# DEPRECATED'  { L _ ITdeprecated_prag }
274  '{-# WARNING'     { L _ ITwarning_prag }
275  '{-# UNPACK'      { L _ ITunpack_prag }
276  '{-# ANN'         { L _ ITann_prag }
277  '#-}'             { L _ ITclose_prag }
278
279  '..'           { L _ ITdotdot }                        -- reserved symbols
280  ':'            { L _ ITcolon }
281  '::'           { L _ ITdcolon }
282  '='            { L _ ITequal }
283  '\\'           { L _ ITlam }
284  '|'            { L _ ITvbar }
285  '<-'           { L _ ITlarrow }
286  '->'           { L _ ITrarrow }
287  '@'            { L _ ITat }
288  '~'            { L _ ITtilde }
289  '=>'           { L _ ITdarrow }
290  '-'            { L _ ITminus }
291  '!'            { L _ ITbang }
292  '*'            { L _ ITstar }
293  '-<'           { L _ ITlarrowtail }            -- for arrow notation
294  '>-'           { L _ ITrarrowtail }            -- for arrow notation
295  '-<<'          { L _ ITLarrowtail }            -- for arrow notation
296  '>>-'          { L _ ITRarrowtail }            -- for arrow notation
297  '.'            { L _ ITdot }
298
299  '{'            { L _ ITocurly }                        -- special symbols
300  '}'            { L _ ITccurly }
301  '{|'           { L _ ITocurlybar }
302  '|}'           { L _ ITccurlybar }
303  vocurly        { L _ ITvocurly } -- virtual open curly (from layout)
304  vccurly        { L _ ITvccurly } -- virtual close curly (from layout)
305  '['            { L _ ITobrack }
306  ']'            { L _ ITcbrack }
307  '[:'           { L _ ITopabrack }
308  ':]'           { L _ ITcpabrack }
309  '('            { L _ IToparen }
310  ')'            { L _ ITcparen }
311  '(#'           { L _ IToubxparen }
312  '#)'           { L _ ITcubxparen }
313  '(|'           { L _ IToparenbar }
314  '|)'           { L _ ITcparenbar }
315  ';'            { L _ ITsemi }
316  ','            { L _ ITcomma }
317  '`'            { L _ ITbackquote }
318
319  VARID          { L _ (ITvarid    _) }          -- identifiers
320  CONID          { L _ (ITconid    _) }
321  VARSYM         { L _ (ITvarsym   _) }
322  CONSYM         { L _ (ITconsym   _) }
323  QVARID         { L _ (ITqvarid   _) }
324  QCONID         { L _ (ITqconid   _) }
325  QVARSYM        { L _ (ITqvarsym  _) }
326  QCONSYM        { L _ (ITqconsym  _) }
327  PREFIXQVARSYM  { L _ (ITprefixqvarsym  _) }
328  PREFIXQCONSYM  { L _ (ITprefixqconsym  _) }
329
330  IPDUPVARID     { L _ (ITdupipvarid   _) }              -- GHC extension
331
332  CHAR           { L _ (ITchar     _) }
333  STRING         { L _ (ITstring   _) }
334  INTEGER        { L _ (ITinteger  _) }
335  RATIONAL       { L _ (ITrational _) }
336                     
337  PRIMCHAR       { L _ (ITprimchar   _) }
338  PRIMSTRING     { L _ (ITprimstring _) }
339  PRIMINTEGER    { L _ (ITprimint    _) }
340  PRIMWORD       { L _ (ITprimword  _) }
341  PRIMFLOAT      { L _ (ITprimfloat  _) }
342  PRIMDOUBLE     { L _ (ITprimdouble _) }
343
344  DOCNEXT        { L _ (ITdocCommentNext _) }
345  DOCPREV        { L _ (ITdocCommentPrev _) }
346  DOCNAMED       { L _ (ITdocCommentNamed _) }
347  DOCSECTION     { L _ (ITdocSection _ _) }
348
349 -- Template Haskell 
350 '[|'            { L _ ITopenExpQuote  }       
351 '[p|'           { L _ ITopenPatQuote  }      
352 '[t|'           { L _ ITopenTypQuote  }      
353 '[d|'           { L _ ITopenDecQuote  }      
354 '|]'            { L _ ITcloseQuote    }
355 TH_ID_SPLICE    { L _ (ITidEscape _)  }     -- $x
356 '$('            { L _ ITparenEscape   }     -- $( exp )
357 TH_VAR_QUOTE    { L _ ITvarQuote      }     -- 'x
358 TH_TY_QUOTE     { L _ ITtyQuote       }      -- ''T
359 TH_QUASIQUOTE   { L _ (ITquasiQuote _) }
360
361 %monad { P } { >>= } { return }
362 %lexer { lexer } { L _ ITeof }
363 %name parseModule module
364 %name parseStmt   maybe_stmt
365 %name parseIdentifier  identifier
366 %name parseType ctype
367 %partial parseHeader header
368 %tokentype { (Located Token) }
369 %%
370
371 -----------------------------------------------------------------------------
372 -- Identifiers; one of the entry points
373 identifier :: { Located RdrName }
374         : qvar                          { $1 }
375         | qcon                          { $1 }
376         | qvarop                        { $1 }
377         | qconop                        { $1 }
378     | '(' '->' ')'      { LL $ getRdrName funTyCon }
379
380 -----------------------------------------------------------------------------
381 -- Module Header
382
383 -- The place for module deprecation is really too restrictive, but if it
384 -- was allowed at its natural place just before 'module', we get an ugly
385 -- s/r conflict with the second alternative. Another solution would be the
386 -- introduction of a new pragma DEPRECATED_MODULE, but this is not very nice,
387 -- either, and DEPRECATED is only expected to be used by people who really
388 -- know what they are doing. :-)
389
390 module  :: { Located (HsModule RdrName) }
391         : maybedocheader 'module' modid maybemodwarning maybeexports 'where' body
392                 {% fileSrcSpan >>= \ loc ->
393                    return (L loc (HsModule (Just $3) $5 (fst $7) (snd $7) $4 $1
394                           ) )}
395         | body2
396                 {% fileSrcSpan >>= \ loc ->
397                    return (L loc (HsModule Nothing Nothing
398                           (fst $1) (snd $1) Nothing Nothing
399                           )) }
400
401 maybedocheader :: { Maybe LHsDocString }
402         : moduleheader            { $1 }
403         | {- empty -}             { Nothing }
404
405 missing_module_keyword :: { () }
406         : {- empty -}                           {% pushCurrentContext }
407
408 maybemodwarning :: { Maybe WarningTxt }
409     : '{-# DEPRECATED' strings '#-}' { Just (DeprecatedTxt $ unLoc $2) }
410     | '{-# WARNING' strings '#-}'    { Just (WarningTxt $ unLoc $2) }
411     |  {- empty -}                  { Nothing }
412
413 body    :: { ([LImportDecl RdrName], [LHsDecl RdrName]) }
414         :  '{'            top '}'               { $2 }
415         |      vocurly    top close             { $2 }
416
417 body2   :: { ([LImportDecl RdrName], [LHsDecl RdrName]) }
418         :  '{' top '}'                          { $2 }
419         |  missing_module_keyword top close     { $2 }
420
421 top     :: { ([LImportDecl RdrName], [LHsDecl RdrName]) }
422         : importdecls                           { (reverse $1,[]) }
423         | importdecls ';' cvtopdecls            { (reverse $1,$3) }
424         | cvtopdecls                            { ([],$1) }
425
426 cvtopdecls :: { [LHsDecl RdrName] }
427         : topdecls                              { cvTopDecls $1 }
428
429 -----------------------------------------------------------------------------
430 -- Module declaration & imports only
431
432 header  :: { Located (HsModule RdrName) }
433         : maybedocheader 'module' modid maybemodwarning maybeexports 'where' header_body
434                 {% fileSrcSpan >>= \ loc ->
435                    return (L loc (HsModule (Just $3) $5 $7 [] $4 $1
436                           ))}
437         | missing_module_keyword importdecls
438                 {% fileSrcSpan >>= \ loc ->
439                    return (L loc (HsModule Nothing Nothing $2 [] Nothing
440                           Nothing)) }
441
442 header_body :: { [LImportDecl RdrName] }
443         :  '{'            importdecls           { $2 }
444         |      vocurly    importdecls           { $2 }
445
446 -----------------------------------------------------------------------------
447 -- The Export List
448
449 maybeexports :: { Maybe [LIE RdrName] }
450         :  '(' exportlist ')'                   { Just $2 }
451         |  {- empty -}                          { Nothing }
452
453 exportlist :: { [LIE RdrName] }
454         : expdoclist ',' expdoclist             { $1 ++ $3 }
455         | exportlist1                           { $1 }
456
457 exportlist1 :: { [LIE RdrName] }
458         : expdoclist export expdoclist ',' exportlist  { $1 ++ ($2 : $3) ++ $5 }
459         | expdoclist export expdoclist                 { $1 ++ ($2 : $3) }
460         | expdoclist                                   { $1 }
461
462 expdoclist :: { [LIE RdrName] }
463         : exp_doc expdoclist                           { $1 : $2 }
464         | {- empty -}                                  { [] }
465
466 exp_doc :: { LIE RdrName }                                                   
467         : docsection    { L1 (case (unLoc $1) of (n, doc) -> IEGroup n doc) }
468         | docnamed      { L1 (IEDocNamed ((fst . unLoc) $1)) } 
469         | docnext       { L1 (IEDoc (unLoc $1)) }       
470                        
471    -- No longer allow things like [] and (,,,) to be exported
472    -- They are built in syntax, always available
473 export  :: { LIE RdrName }
474         :  qvar                         { L1 (IEVar (unLoc $1)) }
475         |  oqtycon                      { L1 (IEThingAbs (unLoc $1)) }
476         |  oqtycon '(' '..' ')'         { LL (IEThingAll (unLoc $1)) }
477         |  oqtycon '(' ')'              { LL (IEThingWith (unLoc $1) []) }
478         |  oqtycon '(' qcnames ')'      { LL (IEThingWith (unLoc $1) (reverse $3)) }
479         |  'module' modid               { LL (IEModuleContents (unLoc $2)) }
480
481 qcnames :: { [RdrName] }
482         :  qcnames ',' qcname_ext       { unLoc $3 : $1 }
483         |  qcname_ext                   { [unLoc $1]  }
484
485 qcname_ext :: { Located RdrName }       -- Variable or data constructor
486                                         -- or tagged type constructor
487         :  qcname                       { $1 }
488         |  'type' qcon                  { sL (comb2 $1 $2) 
489                                              (setRdrNameSpace (unLoc $2) 
490                                                               tcClsName)  }
491
492 -- Cannot pull into qcname_ext, as qcname is also used in expression.
493 qcname  :: { Located RdrName }  -- Variable or data constructor
494         :  qvar                         { $1 }
495         |  qcon                         { $1 }
496
497 -----------------------------------------------------------------------------
498 -- Import Declarations
499
500 -- import decls can be *empty*, or even just a string of semicolons
501 -- whereas topdecls must contain at least one topdecl.
502
503 importdecls :: { [LImportDecl RdrName] }
504         : importdecls ';' importdecl            { $3 : $1 }
505         | importdecls ';'                       { $1 }
506         | importdecl                            { [ $1 ] }
507         | {- empty -}                           { [] }
508
509 importdecl :: { LImportDecl RdrName }
510         : 'import' maybe_src optqualified maybe_pkg modid maybeas maybeimpspec 
511                 { L (comb4 $1 $5 $6 $7) (ImportDecl $5 $4 $2 $3 (unLoc $6) (unLoc $7)) }
512
513 maybe_src :: { IsBootInterface }
514         : '{-# SOURCE' '#-}'                    { True }
515         | {- empty -}                           { False }
516
517 maybe_pkg :: { Maybe FastString }
518         : STRING                                { Just (getSTRING $1) }
519         | {- empty -}                           { Nothing }
520
521 optqualified :: { Bool }
522         : 'qualified'                           { True  }
523         | {- empty -}                           { False }
524
525 maybeas :: { Located (Maybe ModuleName) }
526         : 'as' modid                            { LL (Just (unLoc $2)) }
527         | {- empty -}                           { noLoc Nothing }
528
529 maybeimpspec :: { Located (Maybe (Bool, [LIE RdrName])) }
530         : impspec                               { L1 (Just (unLoc $1)) }
531         | {- empty -}                           { noLoc Nothing }
532
533 impspec :: { Located (Bool, [LIE RdrName]) }
534         :  '(' exportlist ')'                   { LL (False, $2) }
535         |  'hiding' '(' exportlist ')'          { LL (True,  $3) }
536
537 -----------------------------------------------------------------------------
538 -- Fixity Declarations
539
540 prec    :: { Int }
541         : {- empty -}           { 9 }
542         | INTEGER               {% checkPrecP (L1 (fromInteger (getINTEGER $1))) }
543
544 infix   :: { Located FixityDirection }
545         : 'infix'                               { L1 InfixN  }
546         | 'infixl'                              { L1 InfixL  }
547         | 'infixr'                              { L1 InfixR }
548
549 ops     :: { Located [Located RdrName] }
550         : ops ',' op                            { LL ($3 : unLoc $1) }
551         | op                                    { L1 [$1] }
552
553 -----------------------------------------------------------------------------
554 -- Top-Level Declarations
555
556 topdecls :: { OrdList (LHsDecl RdrName) }
557         : topdecls ';' topdecl                  { $1 `appOL` $3 }
558         | topdecls ';'                          { $1 }
559         | topdecl                               { $1 }
560
561 topdecl :: { OrdList (LHsDecl RdrName) }
562         : cl_decl                       { unitOL (L1 (TyClD (unLoc $1))) }
563         | ty_decl                       { unitOL (L1 (TyClD (unLoc $1))) }
564         | 'instance' inst_type where_inst
565             { let (binds, sigs, ats, _) = cvBindsAndSigs (unLoc $3)
566               in 
567               unitOL (L (comb3 $1 $2 $3) (InstD (InstDecl $2 binds sigs ats)))}
568         | stand_alone_deriving                  { unitOL (LL (DerivD (unLoc $1))) }
569         | 'default' '(' comma_types0 ')'        { unitOL (LL $ DefD (DefaultDecl $3)) }
570         | 'foreign' fdecl                       { unitOL (LL (unLoc $2)) }
571         | '{-# DEPRECATED' deprecations '#-}'   { $2 }
572         | '{-# WARNING' warnings '#-}'          { $2 }
573         | '{-# RULES' rules '#-}'               { $2 }
574         | annotation { unitOL $1 }
575         | decl                                  { unLoc $1 }
576
577         -- Template Haskell Extension
578         -- The $(..) form is one possible form of infixexp
579         -- but we treat an arbitrary expression just as if 
580         -- it had a $(..) wrapped around it
581         | infixexp                              { unitOL (LL $ mkTopSpliceDecl $1) } 
582
583 -- Type classes
584 --
585 cl_decl :: { LTyClDecl RdrName }
586         : 'class' tycl_hdr fds where_cls        {% mkClassDecl (comb4 $1 $2 $3 $4) $2 $3 $4 }
587
588 -- Type declarations (toplevel)
589 --
590 ty_decl :: { LTyClDecl RdrName }
591            -- ordinary type synonyms
592         : 'type' type '=' ctypedoc
593                 -- Note ctype, not sigtype, on the right of '='
594                 -- We allow an explicit for-all but we don't insert one
595                 -- in   type Foo a = (b,b)
596                 -- Instead we just say b is out of scope
597                 --
598                 -- Note the use of type for the head; this allows
599                 -- infix type constructors to be declared 
600                 {% mkTySynonym (comb2 $1 $4) False $2 $4 }
601
602            -- type family declarations
603         | 'type' 'family' type opt_kind_sig 
604                 -- Note the use of type for the head; this allows
605                 -- infix type constructors to be declared
606                 {% mkTyFamily (comb3 $1 $3 $4) TypeFamily $3 (unLoc $4) }
607
608            -- type instance declarations
609         | 'type' 'instance' type '=' ctype
610                 -- Note the use of type for the head; this allows
611                 -- infix type constructors and type patterns
612                 {% mkTySynonym (comb2 $1 $5) True $3 $5 }
613
614           -- ordinary data type or newtype declaration
615         | data_or_newtype tycl_hdr constrs deriving
616                 {% mkTyData (comb4 $1 $2 $3 $4) (unLoc $1) False $2 
617                             Nothing (reverse (unLoc $3)) (unLoc $4) }
618                                    -- We need the location on tycl_hdr in case 
619                                    -- constrs and deriving are both empty
620
621           -- ordinary GADT declaration
622         | data_or_newtype tycl_hdr opt_kind_sig 
623                  gadt_constrlist
624                  deriving
625                 {% mkTyData (comb4 $1 $2 $4 $5) (unLoc $1) False $2 
626                             (unLoc $3) (unLoc $4) (unLoc $5) }
627                                    -- We need the location on tycl_hdr in case 
628                                    -- constrs and deriving are both empty
629
630           -- data/newtype family
631         | 'data' 'family' type opt_kind_sig
632                 {% mkTyFamily (comb3 $1 $2 $4) DataFamily $3 (unLoc $4) }
633
634           -- data/newtype instance declaration
635         | data_or_newtype 'instance' tycl_hdr constrs deriving
636                 {% mkTyData (comb4 $1 $3 $4 $5) (unLoc $1) True $3
637                             Nothing (reverse (unLoc $4)) (unLoc $5) }
638
639           -- GADT instance declaration
640         | data_or_newtype 'instance' tycl_hdr opt_kind_sig 
641                  gadt_constrlist
642                  deriving
643                 {% mkTyData (comb4 $1 $3 $5 $6) (unLoc $1) True $3
644                             (unLoc $4) (unLoc $5) (unLoc $6) }
645
646 -- Associated type family declarations
647 --
648 -- * They have a different syntax than on the toplevel (no family special
649 --   identifier).
650 --
651 -- * They also need to be separate from instances; otherwise, data family
652 --   declarations without a kind signature cause parsing conflicts with empty
653 --   data declarations. 
654 --
655 at_decl_cls :: { LTyClDecl RdrName }
656            -- type family declarations
657         : 'type' type opt_kind_sig
658                 -- Note the use of type for the head; this allows
659                 -- infix type constructors to be declared
660                 {% mkTyFamily (comb3 $1 $2 $3) TypeFamily $2 (unLoc $3) }
661
662            -- default type instance
663         | 'type' type '=' ctype
664                 -- Note the use of type for the head; this allows
665                 -- infix type constructors and type patterns
666                 {% mkTySynonym (comb2 $1 $4) True $2 $4 }
667
668           -- data/newtype family declaration
669         | 'data' type opt_kind_sig
670                 {% mkTyFamily (comb3 $1 $2 $3) DataFamily $2 (unLoc $3) }
671
672 -- Associated type instances
673 --
674 at_decl_inst :: { LTyClDecl RdrName }
675            -- type instance declarations
676         : 'type' type '=' ctype
677                 -- Note the use of type for the head; this allows
678                 -- infix type constructors and type patterns
679                 {% mkTySynonym (comb2 $1 $4) True $2 $4 }
680
681         -- data/newtype instance declaration
682         | data_or_newtype tycl_hdr constrs deriving
683                 {% mkTyData (comb4 $1 $2 $3 $4) (unLoc $1) True $2 
684                             Nothing (reverse (unLoc $3)) (unLoc $4) }
685
686         -- GADT instance declaration
687         | data_or_newtype tycl_hdr opt_kind_sig 
688                  gadt_constrlist
689                  deriving
690                 {% mkTyData (comb4 $1 $2 $4 $5) (unLoc $1) True $2 
691                             (unLoc $3) (unLoc $4) (unLoc $5) }
692
693 data_or_newtype :: { Located NewOrData }
694         : 'data'        { L1 DataType }
695         | 'newtype'     { L1 NewType }
696
697 opt_kind_sig :: { Located (Maybe Kind) }
698         :                               { noLoc Nothing }
699         | '::' kind                     { LL (Just (unLoc $2)) }
700
701 -- tycl_hdr parses the header of a class or data type decl,
702 -- which takes the form
703 --      T a b
704 --      Eq a => T a
705 --      (Eq a, Ord b) => T a b
706 --      T Int [a]                       -- for associated types
707 -- Rather a lot of inlining here, else we get reduce/reduce errors
708 tycl_hdr :: { Located (Maybe (LHsContext RdrName), LHsType RdrName) }
709         : context '=>' type             { LL (Just $1, $3) }
710         | type                          { L1 (Nothing, $1) }
711
712 -----------------------------------------------------------------------------
713 -- Stand-alone deriving
714
715 -- Glasgow extension: stand-alone deriving declarations
716 stand_alone_deriving :: { LDerivDecl RdrName }
717         : 'deriving' 'instance' inst_type { LL (DerivDecl $3) }
718
719 -----------------------------------------------------------------------------
720 -- Nested declarations
721
722 -- Declaration in class bodies
723 --
724 decl_cls  :: { Located (OrdList (LHsDecl RdrName)) }
725 decl_cls  : at_decl_cls                 { LL (unitOL (L1 (TyClD (unLoc $1)))) }
726           | decl                        { $1 }
727
728 decls_cls :: { Located (OrdList (LHsDecl RdrName)) }    -- Reversed
729           : decls_cls ';' decl_cls      { LL (unLoc $1 `appOL` unLoc $3) }
730           | decls_cls ';'               { LL (unLoc $1) }
731           | decl_cls                    { $1 }
732           | {- empty -}                 { noLoc nilOL }
733
734
735 decllist_cls
736         :: { Located (OrdList (LHsDecl RdrName)) }      -- Reversed
737         : '{'         decls_cls '}'     { LL (unLoc $2) }
738         |     vocurly decls_cls close   { $2 }
739
740 -- Class body
741 --
742 where_cls :: { Located (OrdList (LHsDecl RdrName)) }    -- Reversed
743                                 -- No implicit parameters
744                                 -- May have type declarations
745         : 'where' decllist_cls          { LL (unLoc $2) }
746         | {- empty -}                   { noLoc nilOL }
747
748 -- Declarations in instance bodies
749 --
750 decl_inst  :: { Located (OrdList (LHsDecl RdrName)) }
751 decl_inst  : at_decl_inst               { LL (unitOL (L1 (TyClD (unLoc $1)))) }
752            | decl                       { $1 }
753
754 decls_inst :: { Located (OrdList (LHsDecl RdrName)) }   -- Reversed
755            : decls_inst ';' decl_inst   { LL (unLoc $1 `appOL` unLoc $3) }
756            | decls_inst ';'             { LL (unLoc $1) }
757            | decl_inst                  { $1 }
758            | {- empty -}                { noLoc nilOL }
759
760 decllist_inst 
761         :: { Located (OrdList (LHsDecl RdrName)) }      -- Reversed
762         : '{'         decls_inst '}'    { LL (unLoc $2) }
763         |     vocurly decls_inst close  { $2 }
764
765 -- Instance body
766 --
767 where_inst :: { Located (OrdList (LHsDecl RdrName)) }   -- Reversed
768                                 -- No implicit parameters
769                                 -- May have type declarations
770         : 'where' decllist_inst         { LL (unLoc $2) }
771         | {- empty -}                   { noLoc nilOL }
772
773 -- Declarations in binding groups other than classes and instances
774 --
775 decls   :: { Located (OrdList (LHsDecl RdrName)) }      
776         : decls ';' decl                { let { this = unLoc $3;
777                                     rest = unLoc $1;
778                                     these = rest `appOL` this }
779                               in rest `seq` this `seq` these `seq`
780                                     LL these }
781         | decls ';'                     { LL (unLoc $1) }
782         | decl                          { $1 }
783         | {- empty -}                   { noLoc nilOL }
784
785 decllist :: { Located (OrdList (LHsDecl RdrName)) }
786         : '{'            decls '}'      { LL (unLoc $2) }
787         |     vocurly    decls close    { $2 }
788
789 -- Binding groups other than those of class and instance declarations
790 --
791 binds   ::  { Located (HsLocalBinds RdrName) }          -- May have implicit parameters
792                                                 -- No type declarations
793         : decllist                      { L1 (HsValBinds (cvBindGroup (unLoc $1))) }
794         | '{'            dbinds '}'     { LL (HsIPBinds (IPBinds (unLoc $2) emptyTcEvBinds)) }
795         |     vocurly    dbinds close   { L (getLoc $2) (HsIPBinds (IPBinds (unLoc $2) emptyTcEvBinds)) }
796
797 wherebinds :: { Located (HsLocalBinds RdrName) }        -- May have implicit parameters
798                                                 -- No type declarations
799         : 'where' binds                 { LL (unLoc $2) }
800         | {- empty -}                   { noLoc emptyLocalBinds }
801
802
803 -----------------------------------------------------------------------------
804 -- Transformation Rules
805
806 rules   :: { OrdList (LHsDecl RdrName) }
807         :  rules ';' rule                       { $1 `snocOL` $3 }
808         |  rules ';'                            { $1 }
809         |  rule                                 { unitOL $1 }
810         |  {- empty -}                          { nilOL }
811
812 rule    :: { LHsDecl RdrName }
813         : STRING activation rule_forall infixexp '=' exp
814              { LL $ RuleD (HsRule (getSTRING $1) 
815                                   ($2 `orElse` AlwaysActive) 
816                                   $3 $4 placeHolderNames $6 placeHolderNames) }
817
818 activation :: { Maybe Activation } 
819         : {- empty -}                           { Nothing }
820         | explicit_activation                   { Just $1 }
821
822 explicit_activation :: { Activation }  -- In brackets
823         : '[' INTEGER ']'               { ActiveAfter  (fromInteger (getINTEGER $2)) }
824         | '[' '~' INTEGER ']'           { ActiveBefore (fromInteger (getINTEGER $3)) }
825
826 rule_forall :: { [RuleBndr RdrName] }
827         : 'forall' rule_var_list '.'            { $2 }
828         | {- empty -}                           { [] }
829
830 rule_var_list :: { [RuleBndr RdrName] }
831         : rule_var                              { [$1] }
832         | rule_var rule_var_list                { $1 : $2 }
833
834 rule_var :: { RuleBndr RdrName }
835         : varid                                 { RuleBndr $1 }
836         | '(' varid '::' ctype ')'              { RuleBndrSig $2 $4 }
837
838 -----------------------------------------------------------------------------
839 -- Warnings and deprecations (c.f. rules)
840
841 warnings :: { OrdList (LHsDecl RdrName) }
842         : warnings ';' warning          { $1 `appOL` $3 }
843         | warnings ';'                  { $1 }
844         | warning                               { $1 }
845         | {- empty -}                           { nilOL }
846
847 -- SUP: TEMPORARY HACK, not checking for `module Foo'
848 warning :: { OrdList (LHsDecl RdrName) }
849         : namelist strings
850                 { toOL [ LL $ WarningD (Warning n (WarningTxt $ unLoc $2))
851                        | n <- unLoc $1 ] }
852
853 deprecations :: { OrdList (LHsDecl RdrName) }
854         : deprecations ';' deprecation          { $1 `appOL` $3 }
855         | deprecations ';'                      { $1 }
856         | deprecation                           { $1 }
857         | {- empty -}                           { nilOL }
858
859 -- SUP: TEMPORARY HACK, not checking for `module Foo'
860 deprecation :: { OrdList (LHsDecl RdrName) }
861         : namelist strings
862                 { toOL [ LL $ WarningD (Warning n (DeprecatedTxt $ unLoc $2))
863                        | n <- unLoc $1 ] }
864
865 strings :: { Located [FastString] }
866     : STRING { L1 [getSTRING $1] }
867     | '[' stringlist ']' { LL $ fromOL (unLoc $2) }
868
869 stringlist :: { Located (OrdList FastString) }
870     : stringlist ',' STRING { LL (unLoc $1 `snocOL` getSTRING $3) }
871     | STRING                { LL (unitOL (getSTRING $1)) }
872
873 -----------------------------------------------------------------------------
874 -- Annotations
875 annotation :: { LHsDecl RdrName }
876     : '{-# ANN' name_var aexp '#-}'      { LL (AnnD $ HsAnnotation (ValueAnnProvenance (unLoc $2)) $3) }
877     | '{-# ANN' 'type' tycon aexp '#-}'  { LL (AnnD $ HsAnnotation (TypeAnnProvenance (unLoc $3)) $4) }
878     | '{-# ANN' 'module' aexp '#-}'      { LL (AnnD $ HsAnnotation ModuleAnnProvenance $3) }
879
880
881 -----------------------------------------------------------------------------
882 -- Foreign import and export declarations
883
884 fdecl :: { LHsDecl RdrName }
885 fdecl : 'import' callconv safety fspec
886                 {% mkImport $2 $3 (unLoc $4) >>= return.LL }
887       | 'import' callconv        fspec          
888                 {% do { d <- mkImport $2 (PlaySafe False) (unLoc $3);
889                         return (LL d) } }
890       | 'export' callconv fspec
891                 {% mkExport $2 (unLoc $3) >>= return.LL }
892
893 callconv :: { CCallConv }
894           : 'stdcall'                   { StdCallConv }
895           | 'ccall'                     { CCallConv   }
896           | 'prim'                      { PrimCallConv}
897
898 safety :: { Safety }
899         : 'unsafe'                      { PlayRisky }
900         | 'safe'                        { PlaySafe  False }
901         | 'interruptible'               { PlayInterruptible }
902         | 'threadsafe'                  { PlaySafe  True } -- deprecated alias
903
904 fspec :: { Located (Located FastString, Located RdrName, LHsType RdrName) }
905        : STRING var '::' sigtypedoc     { LL (L (getLoc $1) (getSTRING $1), $2, $4) }
906        |        var '::' sigtypedoc     { LL (noLoc nilFS, $1, $3) }
907          -- if the entity string is missing, it defaults to the empty string;
908          -- the meaning of an empty entity string depends on the calling
909          -- convention
910
911 -----------------------------------------------------------------------------
912 -- Type signatures
913
914 opt_sig :: { Maybe (LHsType RdrName) }
915         : {- empty -}                   { Nothing }
916         | '::' sigtype                  { Just $2 }
917
918 opt_asig :: { Maybe (LHsType RdrName) }
919         : {- empty -}                   { Nothing }
920         | '::' atype                    { Just $2 }
921
922 sigtype :: { LHsType RdrName }          -- Always a HsForAllTy,
923                                         -- to tell the renamer where to generalise
924         : ctype                         { L1 (mkImplicitHsForAllTy (noLoc []) $1) }
925         -- Wrap an Implicit forall if there isn't one there already
926
927 sigtypedoc :: { LHsType RdrName }       -- Always a HsForAllTy
928         : ctypedoc                      { L1 (mkImplicitHsForAllTy (noLoc []) $1) }
929         -- Wrap an Implicit forall if there isn't one there already
930
931 sig_vars :: { Located [Located RdrName] }
932          : sig_vars ',' var             { LL ($3 : unLoc $1) }
933          | var                          { L1 [$1] }
934
935 sigtypes1 :: { [LHsType RdrName] }      -- Always HsForAllTys
936         : sigtype                       { [ $1 ] }
937         | sigtype ',' sigtypes1         { $1 : $3 }
938
939 -----------------------------------------------------------------------------
940 -- Types
941
942 infixtype :: { LHsType RdrName }
943         : btype qtyconop type         { LL $ HsOpTy $1 $2 $3 }
944         | btype tyvarop  type    { LL $ HsOpTy $1 $2 $3 }
945
946 strict_mark :: { Located HsBang }
947         : '!'                           { L1 HsStrict }
948         | '{-# UNPACK' '#-}' '!'        { LL HsUnpack }
949
950 -- A ctype is a for-all type
951 ctype   :: { LHsType RdrName }
952         : 'forall' tv_bndrs '.' ctype   { LL $ mkExplicitHsForAllTy $2 (noLoc []) $4 }
953         | context '=>' ctype            { LL $ mkImplicitHsForAllTy   $1 $3 }
954         -- A type of form (context => type) is an *implicit* HsForAllTy
955         | ipvar '::' type               { LL (HsPredTy (HsIParam (unLoc $1) $3)) }
956         | type                          { $1 }
957
958 ----------------------
959 -- Notes for 'ctypedoc'
960 -- It would have been nice to simplify the grammar by unifying `ctype` and 
961 -- ctypedoc` into one production, allowing comments on types everywhere (and
962 -- rejecting them after parsing, where necessary).  This is however not possible
963 -- since it leads to ambiguity. The reason is the support for comments on record
964 -- fields: 
965 --         data R = R { field :: Int -- ^ comment on the field }
966 -- If we allow comments on types here, it's not clear if the comment applies
967 -- to 'field' or to 'Int'. So we must use `ctype` to describe the type.
968
969 ctypedoc :: { LHsType RdrName }
970         : 'forall' tv_bndrs '.' ctypedoc        { LL $ mkExplicitHsForAllTy $2 (noLoc []) $4 }
971         | context '=>' ctypedoc         { LL $ mkImplicitHsForAllTy   $1 $3 }
972         -- A type of form (context => type) is an *implicit* HsForAllTy
973         | ipvar '::' type               { LL (HsPredTy (HsIParam (unLoc $1) $3)) }
974         | typedoc                       { $1 }
975
976 ----------------------
977 -- Notes for 'context'
978 -- We parse a context as a btype so that we don't get reduce/reduce
979 -- errors in ctype.  The basic problem is that
980 --      (Eq a, Ord a)
981 -- looks so much like a tuple type.  We can't tell until we find the =>
982
983 -- We have the t1 ~ t2 form both in 'context' and in type, 
984 -- to permit an individual equational constraint without parenthesis.
985 -- Thus for some reason we allow    f :: a~b => blah
986 -- but not                          f :: ?x::Int => blah
987 context :: { LHsContext RdrName }
988         : btype '~'      btype          {% checkContext
989                                              (LL $ HsPredTy (HsEqualP $1 $3)) }
990         | btype                         {% checkContext $1 }
991
992 type :: { LHsType RdrName }
993         : btype                         { $1 }
994         | btype qtyconop type           { LL $ HsOpTy $1 $2 $3 }
995         | btype tyvarop  type           { LL $ HsOpTy $1 $2 $3 }
996         | btype '->'     ctype          { LL $ HsFunTy $1 $3 }
997         | btype '~'      btype          { LL $ HsPredTy (HsEqualP $1 $3) }
998
999 typedoc :: { LHsType RdrName }
1000         : btype                          { $1 }
1001         | btype docprev                  { LL $ HsDocTy $1 $2 }
1002         | btype qtyconop type            { LL $ HsOpTy $1 $2 $3 }
1003         | btype qtyconop type docprev    { LL $ HsDocTy (L (comb3 $1 $2 $3) (HsOpTy $1 $2 $3)) $4 }
1004         | btype tyvarop  type            { LL $ HsOpTy $1 $2 $3 }
1005         | btype tyvarop  type docprev    { LL $ HsDocTy (L (comb3 $1 $2 $3) (HsOpTy $1 $2 $3)) $4 }
1006         | btype '->'     ctypedoc        { LL $ HsFunTy $1 $3 }
1007         | btype docprev '->' ctypedoc    { LL $ HsFunTy (L (comb2 $1 $2) (HsDocTy $1 $2)) $4 }
1008         | btype '~'      btype           { LL $ HsPredTy (HsEqualP $1 $3) }
1009
1010 btype :: { LHsType RdrName }
1011         : btype atype                   { LL $ HsAppTy $1 $2 }
1012         | atype                         { $1 }
1013
1014 atype :: { LHsType RdrName }
1015         : gtycon                        { L1 (HsTyVar (unLoc $1)) }
1016         | tyvar                         { L1 (HsTyVar (unLoc $1)) }
1017         | strict_mark atype             { LL (HsBangTy (unLoc $1) $2) }  -- Constructor sigs only
1018         | '{' fielddecls '}'            { LL $ HsRecTy $2 }              -- Constructor sigs only
1019         | '(' ctype ',' comma_types1 ')'  { LL $ HsTupleTy Boxed  ($2:$4) }
1020         | '(#' comma_types1 '#)'        { LL $ HsTupleTy Unboxed $2     }
1021         | '[' ctype ']'                 { LL $ HsListTy  $2 }
1022         | '[:' ctype ':]'               { LL $ HsPArrTy  $2 }
1023         | '(' ctype ')'                 { LL $ HsParTy   $2 }
1024         | '(' ctype '::' kind ')'       { LL $ HsKindSig $2 (unLoc $4) }
1025         | quasiquote                    { L1 (HsQuasiQuoteTy (unLoc $1)) }
1026         | '$(' exp ')'                  { LL $ mkHsSpliceTy $2 }
1027         | TH_ID_SPLICE                  { LL $ mkHsSpliceTy $ L1 $ HsVar $ 
1028                                           mkUnqual varName (getTH_ID_SPLICE $1) }
1029 -- Generics
1030         | INTEGER                       { L1 (HsNumTy (getINTEGER $1)) }
1031
1032 -- An inst_type is what occurs in the head of an instance decl
1033 --      e.g.  (Foo a, Gaz b) => Wibble a b
1034 -- It's kept as a single type, with a MonoDictTy at the right
1035 -- hand corner, for convenience.
1036 inst_type :: { LHsType RdrName }
1037         : sigtype                       {% checkInstType $1 }
1038
1039 inst_types1 :: { [LHsType RdrName] }
1040         : inst_type                     { [$1] }
1041         | inst_type ',' inst_types1     { $1 : $3 }
1042
1043 comma_types0  :: { [LHsType RdrName] }
1044         : comma_types1                  { $1 }
1045         | {- empty -}                   { [] }
1046
1047 comma_types1    :: { [LHsType RdrName] }
1048         : ctype                         { [$1] }
1049         | ctype  ',' comma_types1       { $1 : $3 }
1050
1051 tv_bndrs :: { [LHsTyVarBndr RdrName] }
1052          : tv_bndr tv_bndrs             { $1 : $2 }
1053          | {- empty -}                  { [] }
1054
1055 tv_bndr :: { LHsTyVarBndr RdrName }
1056         : tyvar                         { L1 (UserTyVar (unLoc $1) placeHolderKind) }
1057         | '(' tyvar '::' kind ')'       { LL (KindedTyVar (unLoc $2) 
1058                                                           (unLoc $4)) }
1059
1060 fds :: { Located [Located (FunDep RdrName)] }
1061         : {- empty -}                   { noLoc [] }
1062         | '|' fds1                      { LL (reverse (unLoc $2)) }
1063
1064 fds1 :: { Located [Located (FunDep RdrName)] }
1065         : fds1 ',' fd                   { LL ($3 : unLoc $1) }
1066         | fd                            { L1 [$1] }
1067
1068 fd :: { Located (FunDep RdrName) }
1069         : varids0 '->' varids0          { L (comb3 $1 $2 $3)
1070                                            (reverse (unLoc $1), reverse (unLoc $3)) }
1071
1072 varids0 :: { Located [RdrName] }
1073         : {- empty -}                   { noLoc [] }
1074         | varids0 tyvar                 { LL (unLoc $2 : unLoc $1) }
1075
1076 -----------------------------------------------------------------------------
1077 -- Kinds
1078
1079 kind    :: { Located Kind }
1080         : akind                 { $1 }
1081         | akind '->' kind       { LL (mkArrowKind (unLoc $1) (unLoc $3)) }
1082
1083 akind   :: { Located Kind }
1084         : '*'                   { L1 liftedTypeKind }
1085         | '!'                   { L1 unliftedTypeKind }
1086         | '(' kind ')'          { LL (unLoc $2) }
1087
1088
1089 -----------------------------------------------------------------------------
1090 -- Datatype declarations
1091
1092 gadt_constrlist :: { Located [LConDecl RdrName] }       -- Returned in order
1093         : 'where' '{'        gadt_constrs '}'      { L (comb2 $1 $3) (unLoc $3) }
1094         | 'where' vocurly    gadt_constrs close    { L (comb2 $1 $3) (unLoc $3) }
1095         | {- empty -}                              { noLoc [] }
1096
1097 gadt_constrs :: { Located [LConDecl RdrName] }
1098         : gadt_constr ';' gadt_constrs  { L (comb2 (head $1) $3) ($1 ++ unLoc $3) }
1099         | gadt_constr                   { L (getLoc (head $1)) $1 }
1100         | {- empty -}                   { noLoc [] }
1101
1102 -- We allow the following forms:
1103 --      C :: Eq a => a -> T a
1104 --      C :: forall a. Eq a => !a -> T a
1105 --      D { x,y :: a } :: T a
1106 --      forall a. Eq a => D { x,y :: a } :: T a
1107
1108 gadt_constr :: { [LConDecl RdrName] }   -- Returns a list because of:   C,D :: ty
1109         : con_list '::' sigtype
1110                 { map (sL (comb2 $1 $3)) (mkGadtDecl (unLoc $1) $3) } 
1111
1112                 -- Deprecated syntax for GADT record declarations
1113         | oqtycon '{' fielddecls '}' '::' sigtype
1114                 {% do { cd <- mkDeprecatedGadtRecordDecl (comb2 $1 $6) $1 $3 $6
1115                       ; return [cd] } }
1116
1117 constrs :: { Located [LConDecl RdrName] }
1118         : maybe_docnext '=' constrs1    { L (comb2 $2 $3) (addConDocs (unLoc $3) $1) }
1119
1120 constrs1 :: { Located [LConDecl RdrName] }
1121         : constrs1 maybe_docnext '|' maybe_docprev constr { LL (addConDoc $5 $2 : addConDocFirst (unLoc $1) $4) }
1122         | constr                                          { L1 [$1] }
1123
1124 constr :: { LConDecl RdrName }
1125         : maybe_docnext forall context '=>' constr_stuff maybe_docprev  
1126                 { let (con,details) = unLoc $5 in 
1127                   addConDoc (L (comb4 $2 $3 $4 $5) (mkSimpleConDecl con (unLoc $2) $3 details))
1128                             ($1 `mplus` $6) }
1129         | maybe_docnext forall constr_stuff maybe_docprev
1130                 { let (con,details) = unLoc $3 in 
1131                   addConDoc (L (comb2 $2 $3) (mkSimpleConDecl con (unLoc $2) (noLoc []) details))
1132                             ($1 `mplus` $4) }
1133
1134 forall :: { Located [LHsTyVarBndr RdrName] }
1135         : 'forall' tv_bndrs '.'         { LL $2 }
1136         | {- empty -}                   { noLoc [] }
1137
1138 constr_stuff :: { Located (Located RdrName, HsConDeclDetails RdrName) }
1139 -- We parse the constructor declaration 
1140 --      C t1 t2
1141 -- as a btype (treating C as a type constructor) and then convert C to be
1142 -- a data constructor.  Reason: it might continue like this:
1143 --      C t1 t2 %: D Int
1144 -- in which case C really would be a type constructor.  We can't resolve this
1145 -- ambiguity till we come across the constructor oprerator :% (or not, more usually)
1146         : btype                         {% splitCon $1 >>= return.LL }
1147         | btype conop btype             {  LL ($2, InfixCon $1 $3) }
1148
1149 fielddecls :: { [ConDeclField RdrName] }
1150         : {- empty -}     { [] }
1151         | fielddecls1     { $1 }
1152
1153 fielddecls1 :: { [ConDeclField RdrName] }
1154         : fielddecl maybe_docnext ',' maybe_docprev fielddecls1
1155                       { [ addFieldDoc f $4 | f <- $1 ] ++ addFieldDocs $5 $2 }
1156                              -- This adds the doc $4 to each field separately
1157         | fielddecl   { $1 }
1158
1159 fielddecl :: { [ConDeclField RdrName] }    -- A list because of   f,g :: Int
1160         : maybe_docnext sig_vars '::' ctype maybe_docprev      { [ ConDeclField fld $4 ($1 `mplus` $5) 
1161                                                                  | fld <- reverse (unLoc $2) ] }
1162
1163 -- We allow the odd-looking 'inst_type' in a deriving clause, so that
1164 -- we can do deriving( forall a. C [a] ) in a newtype (GHC extension).
1165 -- The 'C [a]' part is converted to an HsPredTy by checkInstType
1166 -- We don't allow a context, but that's sorted out by the type checker.
1167 deriving :: { Located (Maybe [LHsType RdrName]) }
1168         : {- empty -}                           { noLoc Nothing }
1169         | 'deriving' qtycon     {% do { let { L loc tv = $2 }
1170                                       ; p <- checkInstType (L loc (HsTyVar tv))
1171                                       ; return (LL (Just [p])) } }
1172         | 'deriving' '(' ')'                    { LL (Just []) }
1173         | 'deriving' '(' inst_types1 ')'        { LL (Just $3) }
1174              -- Glasgow extension: allow partial 
1175              -- applications in derivings
1176
1177 -----------------------------------------------------------------------------
1178 -- Value definitions
1179
1180 {- Note [Declaration/signature overlap]
1181 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1182 There's an awkward overlap with a type signature.  Consider
1183         f :: Int -> Int = ...rhs...
1184    Then we can't tell whether it's a type signature or a value
1185    definition with a result signature until we see the '='.
1186    So we have to inline enough to postpone reductions until we know.
1187 -}
1188
1189 {-
1190   ATTENTION: Dirty Hackery Ahead! If the second alternative of vars is var
1191   instead of qvar, we get another shift/reduce-conflict. Consider the
1192   following programs:
1193   
1194      { (^^) :: Int->Int ; }          Type signature; only var allowed
1195
1196      { (^^) :: Int->Int = ... ; }    Value defn with result signature;
1197                                      qvar allowed (because of instance decls)
1198   
1199   We can't tell whether to reduce var to qvar until after we've read the signatures.
1200 -}
1201
1202 docdecl :: { LHsDecl RdrName }
1203         : docdecld { L1 (DocD (unLoc $1)) }
1204
1205 docdecld :: { LDocDecl }
1206         : docnext                               { L1 (DocCommentNext (unLoc $1)) }
1207         | docprev                               { L1 (DocCommentPrev (unLoc $1)) }
1208         | docnamed                              { L1 (case (unLoc $1) of (n, doc) -> DocCommentNamed n doc) }
1209         | docsection                            { L1 (case (unLoc $1) of (n, doc) -> DocGroup n doc) }
1210
1211 decl    :: { Located (OrdList (LHsDecl RdrName)) }
1212         : sigdecl               { $1 }
1213
1214         | '!' aexp rhs          {% do { let { e = LL (SectionR (LL (HsVar bang_RDR)) $2) };
1215                                         pat <- checkPattern e;
1216                                         return $ LL $ unitOL $ LL $ ValD $
1217                                                PatBind pat (unLoc $3)
1218                                                        placeHolderType placeHolderNames } }
1219                                 -- Turn it all into an expression so that
1220                                 -- checkPattern can check that bangs are enabled
1221
1222         | infixexp opt_sig rhs  {% do { r <- checkValDef $1 $2 $3;
1223                                         let { l = comb2 $1 $> };
1224                                         return $! (sL l (unitOL $! (sL l $ ValD r))) } }
1225         | docdecl               { LL $ unitOL $1 }
1226
1227 rhs     :: { Located (GRHSs RdrName) }
1228         : '=' exp wherebinds    { sL (comb3 $1 $2 $3) $ GRHSs (unguardedRHS $2) (unLoc $3) }
1229         | gdrhs wherebinds      { LL $ GRHSs (reverse (unLoc $1)) (unLoc $2) }
1230
1231 gdrhs :: { Located [LGRHS RdrName] }
1232         : gdrhs gdrh            { LL ($2 : unLoc $1) }
1233         | gdrh                  { L1 [$1] }
1234
1235 gdrh :: { LGRHS RdrName }
1236         : '|' guardquals '=' exp        { sL (comb2 $1 $>) $ GRHS (unLoc $2) $4 }
1237
1238 sigdecl :: { Located (OrdList (LHsDecl RdrName)) }
1239         : infixexp '::' sigtypedoc      {% do s <- checkValSig $1 $3 
1240                                          ; return (LL $ unitOL (LL $ SigD s)) }
1241                 -- See Note [Declaration/signature overlap] for why we need infixexp here
1242         | var ',' sig_vars '::' sigtypedoc
1243                                 { LL $ toOL [ LL $ SigD (TypeSig n $5) | n <- $1 : unLoc $3 ] }
1244         | infix prec ops        { LL $ toOL [ LL $ SigD (FixSig (FixitySig n (Fixity $2 (unLoc $1))))
1245                                              | n <- unLoc $3 ] }
1246         | '{-# INLINE'   activation qvar '#-}'        
1247                 { LL $ unitOL (LL $ SigD (InlineSig $3 (mkInlinePragma (getINLINE $1) $2))) }
1248         | '{-# SPECIALISE' qvar '::' sigtypes1 '#-}'
1249                 { LL $ toOL [ LL $ SigD (SpecSig $2 t defaultInlinePragma) 
1250                                             | t <- $4] }
1251         | '{-# SPECIALISE_INLINE' activation qvar '::' sigtypes1 '#-}'
1252                 { LL $ toOL [ LL $ SigD (SpecSig $3 t (mkInlinePragma (getSPEC_INLINE $1) $2))
1253                                             | t <- $5] }
1254         | '{-# SPECIALISE' 'instance' inst_type '#-}'
1255                 { LL $ unitOL (LL $ SigD (SpecInstSig $3)) }
1256
1257 -----------------------------------------------------------------------------
1258 -- Expressions
1259
1260 quasiquote :: { Located (HsQuasiQuote RdrName) }
1261         : TH_QUASIQUOTE   { let { loc = getLoc $1
1262                                 ; ITquasiQuote (quoter, quote, quoteSpan) = unLoc $1
1263                                 ; quoterId = mkUnqual varName quoter }
1264                             in L1 (mkHsQuasiQuote quoterId quoteSpan quote) }
1265
1266 exp   :: { LHsExpr RdrName }
1267         : infixexp '::' sigtype         { LL $ ExprWithTySig $1 $3 }
1268         | infixexp '-<' exp             { LL $ HsArrApp $1 $3 placeHolderType HsFirstOrderApp True }
1269         | infixexp '>-' exp             { LL $ HsArrApp $3 $1 placeHolderType HsFirstOrderApp False }
1270         | infixexp '-<<' exp            { LL $ HsArrApp $1 $3 placeHolderType HsHigherOrderApp True }
1271         | infixexp '>>-' exp            { LL $ HsArrApp $3 $1 placeHolderType HsHigherOrderApp False}
1272         | infixexp                      { $1 }
1273
1274 infixexp :: { LHsExpr RdrName }
1275         : exp10                         { $1 }
1276         | infixexp qop exp10            { LL (OpApp $1 $2 (panic "fixity") $3) }
1277
1278 exp10 :: { LHsExpr RdrName }
1279         : '\\' apat apats opt_asig '->' exp     
1280                         { LL $ HsLam (mkMatchGroup [LL $ Match ($2:$3) $4
1281                                                                 (unguardedGRHSs $6)
1282                                                             ]) }
1283         | 'let' binds 'in' exp                  { LL $ HsLet (unLoc $2) $4 }
1284         | 'if' exp optSemi 'then' exp optSemi 'else' exp
1285                                         {% checkDoAndIfThenElse $2 $3 $5 $6 $8 >>
1286                                            return (LL $ mkHsIf $2 $5 $8) }
1287         | 'case' exp 'of' altslist              { LL $ HsCase $2 (mkMatchGroup (unLoc $4)) }
1288         | '-' fexp                              { LL $ NegApp $2 noSyntaxExpr }
1289
1290         | 'do' stmtlist                 {% let loc = comb2 $1 $2 in
1291                                            checkDo loc (unLoc $2)  >>= \ (stmts,body) ->
1292                                            return (L loc (mkHsDo DoExpr stmts body)) }
1293         | 'mdo' stmtlist                {% let loc = comb2 $1 $2 in
1294                                            checkDo loc (unLoc $2)  >>= \ (stmts,body) ->
1295                                            return (L loc (mkHsDo (MDoExpr noPostTcTable) stmts body)) }
1296         | scc_annot exp                         { LL $ if opt_SccProfilingOn
1297                                                         then HsSCC (unLoc $1) $2
1298                                                         else HsPar $2 }
1299         | hpc_annot exp                         { LL $ if opt_Hpc
1300                                                         then HsTickPragma (unLoc $1) $2
1301                                                         else HsPar $2 }
1302
1303         | 'proc' aexp '->' exp  
1304                         {% checkPattern $2 >>= \ p -> 
1305                            return (LL $ HsProc p (LL $ HsCmdTop $4 [] 
1306                                                    placeHolderType undefined)) }
1307                                                 -- TODO: is LL right here?
1308
1309         | '{-# CORE' STRING '#-}' exp           { LL $ HsCoreAnn (getSTRING $2) $4 }
1310                                                     -- hdaume: core annotation
1311         | fexp                                  { $1 }
1312
1313 optSemi :: { Bool }
1314         : ';'         { True }
1315         | {- empty -} { False }
1316
1317 scc_annot :: { Located FastString }
1318         : '_scc_' STRING                        {% (addWarning Opt_WarnWarningsDeprecations (getLoc $1) (text "_scc_ is deprecated; use an SCC pragma instead")) >>= \_ ->
1319                                    ( do scc <- getSCC $2; return $ LL scc ) }
1320         | '{-# SCC' STRING '#-}'                {% do scc <- getSCC $2; return $ LL scc }
1321
1322 hpc_annot :: { Located (FastString,(Int,Int),(Int,Int)) }
1323         : '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'
1324                                                 { LL $ (getSTRING $2
1325                                                        ,( fromInteger $ getINTEGER $3
1326                                                         , fromInteger $ getINTEGER $5
1327                                                         )
1328                                                        ,( fromInteger $ getINTEGER $7
1329                                                         , fromInteger $ getINTEGER $9
1330                                                         )
1331                                                        )
1332                                                  }
1333
1334 fexp    :: { LHsExpr RdrName }
1335         : fexp aexp                             { LL $ HsApp $1 $2 }
1336         | aexp                                  { $1 }
1337
1338 aexp    :: { LHsExpr RdrName }
1339         : qvar '@' aexp                 { LL $ EAsPat $1 $3 }
1340         | '~' aexp                      { LL $ ELazyPat $2 }
1341         | aexp1                 { $1 }
1342
1343 aexp1   :: { LHsExpr RdrName }
1344         : aexp1 '{' fbinds '}'  {% do { r <- mkRecConstrOrUpdate $1 (comb2 $2 $4) $3
1345                                       ; return (LL r) }}
1346         | aexp2                 { $1 }
1347
1348 -- Here was the syntax for type applications that I was planning
1349 -- but there are difficulties (e.g. what order for type args)
1350 -- so it's not enabled yet.
1351 -- But this case *is* used for the left hand side of a generic definition,
1352 -- which is parsed as an expression before being munged into a pattern
1353         | qcname '{|' type '|}'         { LL $ HsApp (sL (getLoc $1) (HsVar (unLoc $1)))
1354                                                      (sL (getLoc $3) (HsType $3)) }
1355
1356 aexp2   :: { LHsExpr RdrName }
1357         : ipvar                         { L1 (HsIPVar $! unLoc $1) }
1358         | qcname                        { L1 (HsVar   $! unLoc $1) }
1359         | literal                       { L1 (HsLit   $! unLoc $1) }
1360 -- This will enable overloaded strings permanently.  Normally the renamer turns HsString
1361 -- into HsOverLit when -foverloaded-strings is on.
1362 --      | STRING                        { sL (getLoc $1) (HsOverLit $! mkHsIsString (getSTRING $1) placeHolderType) }
1363         | INTEGER                       { sL (getLoc $1) (HsOverLit $! mkHsIntegral (getINTEGER $1) placeHolderType) }
1364         | RATIONAL                      { sL (getLoc $1) (HsOverLit $! mkHsFractional (getRATIONAL $1) placeHolderType) }
1365
1366         -- N.B.: sections get parsed by these next two productions.
1367         -- This allows you to write, e.g., '(+ 3, 4 -)', which isn't correct Haskell98
1368         -- (you'd have to write '((+ 3), (4 -))')
1369         -- but the less cluttered version fell out of having texps.
1370         | '(' texp ')'                  { LL (HsPar $2) }
1371         | '(' tup_exprs ')'             { LL (ExplicitTuple $2 Boxed) }
1372
1373         | '(#' texp '#)'                { LL (ExplicitTuple [Present $2] Unboxed) }
1374         | '(#' tup_exprs '#)'           { LL (ExplicitTuple $2 Unboxed) }
1375
1376         | '[' list ']'                  { LL (unLoc $2) }
1377         | '[:' parr ':]'                { LL (unLoc $2) }
1378         | '_'                           { L1 EWildPat }
1379         
1380         -- Template Haskell Extension
1381         | TH_ID_SPLICE          { L1 $ HsSpliceE (mkHsSplice 
1382                                         (L1 $ HsVar (mkUnqual varName 
1383                                                         (getTH_ID_SPLICE $1)))) } 
1384         | '$(' exp ')'          { LL $ HsSpliceE (mkHsSplice $2) }               
1385
1386
1387         | TH_VAR_QUOTE qvar     { LL $ HsBracket (VarBr (unLoc $2)) }
1388         | TH_VAR_QUOTE qcon     { LL $ HsBracket (VarBr (unLoc $2)) }
1389         | TH_TY_QUOTE tyvar     { LL $ HsBracket (VarBr (unLoc $2)) }
1390         | TH_TY_QUOTE gtycon    { LL $ HsBracket (VarBr (unLoc $2)) }
1391         | '[|' exp '|]'         { LL $ HsBracket (ExpBr $2) }                       
1392         | '[t|' ctype '|]'      { LL $ HsBracket (TypBr $2) }                       
1393         | '[p|' infixexp '|]'   {% checkPattern $2 >>= \p ->
1394                                         return (LL $ HsBracket (PatBr p)) }
1395         | '[d|' cvtopbody '|]'  { LL $ HsBracket (DecBrL $2) }
1396         | quasiquote            { L1 (HsQuasiQuoteE (unLoc $1)) }
1397
1398         -- arrow notation extension
1399         | '(|' aexp2 cmdargs '|)'       { LL $ HsArrForm $2 Nothing (reverse $3) }
1400
1401 cmdargs :: { [LHsCmdTop RdrName] }
1402         : cmdargs acmd                  { $2 : $1 }
1403         | {- empty -}                   { [] }
1404
1405 acmd    :: { LHsCmdTop RdrName }
1406         : aexp2                 { L1 $ HsCmdTop $1 [] placeHolderType undefined }
1407
1408 cvtopbody :: { [LHsDecl RdrName] }
1409         :  '{'            cvtopdecls0 '}'               { $2 }
1410         |      vocurly    cvtopdecls0 close             { $2 }
1411
1412 cvtopdecls0 :: { [LHsDecl RdrName] }
1413         : {- empty -}           { [] }
1414         | cvtopdecls            { $1 }
1415
1416 -----------------------------------------------------------------------------
1417 -- Tuple expressions
1418
1419 -- "texp" is short for tuple expressions: 
1420 -- things that can appear unparenthesized as long as they're
1421 -- inside parens or delimitted by commas
1422 texp :: { LHsExpr RdrName }
1423         : exp                           { $1 }
1424
1425         -- Note [Parsing sections]
1426         -- ~~~~~~~~~~~~~~~~~~~~~~~
1427         -- We include left and right sections here, which isn't
1428         -- technically right according to Haskell 98.  For example
1429         --      (3 +, True) isn't legal
1430         -- However, we want to parse bang patterns like
1431         --      (!x, !y)
1432         -- and it's convenient to do so here as a section
1433         -- Then when converting expr to pattern we unravel it again
1434         -- Meanwhile, the renamer checks that real sections appear
1435         -- inside parens.
1436         | infixexp qop  { LL $ SectionL $1 $2 }
1437         | qopm infixexp       { LL $ SectionR $1 $2 }
1438
1439        -- View patterns get parenthesized above
1440         | exp '->' texp   { LL $ EViewPat $1 $3 }
1441
1442 -- Always at least one comma
1443 tup_exprs :: { [HsTupArg RdrName] }
1444            : texp commas_tup_tail  { Present $1 : $2 }
1445            | commas tup_tail       { replicate $1 missingTupArg ++ $2 }
1446
1447 -- Always starts with commas; always follows an expr
1448 commas_tup_tail :: { [HsTupArg RdrName] }
1449 commas_tup_tail : commas tup_tail  { replicate ($1-1) missingTupArg ++ $2 }
1450
1451 -- Always follows a comma
1452 tup_tail :: { [HsTupArg RdrName] }
1453           : texp commas_tup_tail        { Present $1 : $2 }
1454           | texp                        { [Present $1] }
1455           | {- empty -}                 { [missingTupArg] }
1456
1457 -----------------------------------------------------------------------------
1458 -- List expressions
1459
1460 -- The rules below are little bit contorted to keep lexps left-recursive while
1461 -- avoiding another shift/reduce-conflict.
1462
1463 list :: { LHsExpr RdrName }
1464         : texp                  { L1 $ ExplicitList placeHolderType [$1] }
1465         | lexps                 { L1 $ ExplicitList placeHolderType (reverse (unLoc $1)) }
1466         | texp '..'             { LL $ ArithSeq noPostTcExpr (From $1) }
1467         | texp ',' exp '..'     { LL $ ArithSeq noPostTcExpr (FromThen $1 $3) }
1468         | texp '..' exp         { LL $ ArithSeq noPostTcExpr (FromTo $1 $3) }
1469         | texp ',' exp '..' exp { LL $ ArithSeq noPostTcExpr (FromThenTo $1 $3 $5) }
1470         | texp '|' flattenedpquals      { sL (comb2 $1 $>) $ mkHsDo ListComp (unLoc $3) $1 }
1471
1472 lexps :: { Located [LHsExpr RdrName] }
1473         : lexps ',' texp                { LL (((:) $! $3) $! unLoc $1) }
1474         | texp ',' texp                 { LL [$3,$1] }
1475
1476 -----------------------------------------------------------------------------
1477 -- List Comprehensions
1478
1479 flattenedpquals :: { Located [LStmt RdrName] }
1480     : pquals   { case (unLoc $1) of
1481                     [qs] -> L1 qs
1482                     -- We just had one thing in our "parallel" list so 
1483                     -- we simply return that thing directly
1484                     
1485                     qss -> L1 [L1 $ ParStmt [(qs, undefined) | qs <- qss]]
1486                     -- We actually found some actual parallel lists so
1487                     -- we wrap them into as a ParStmt
1488                 }
1489
1490 pquals :: { Located [[LStmt RdrName]] }
1491     : squals '|' pquals     { L (getLoc $2) (reverse (unLoc $1) : unLoc $3) }
1492     | squals                { L (getLoc $1) [reverse (unLoc $1)] }
1493
1494 squals :: { Located [LStmt RdrName] }   -- In reverse order, because the last 
1495                                         -- one can "grab" the earlier ones
1496     : squals ',' transformqual               { LL [L (getLoc $3) ((unLoc $3) (reverse (unLoc $1)))] }
1497     | squals ',' qual                        { LL ($3 : unLoc $1) }
1498     | transformqual                          { LL [L (getLoc $1) ((unLoc $1) [])] }
1499     | qual                                   { L1 [$1] }
1500 --  | transformquals1 ',' '{|' pquals '|}'   { LL ($4 : unLoc $1) }
1501 --  | '{|' pquals '|}'                       { L1 [$2] }
1502
1503
1504 -- It is possible to enable bracketing (associating) qualifier lists by uncommenting the lines with {| |}
1505 -- above. Due to a lack of consensus on the syntax, this feature is not being used until we get user
1506 -- demand. Note that the {| |} symbols are reused from -XGenerics and hence if you want to compile
1507 -- a program that makes use of this temporary syntax you must supply that flag to GHC
1508
1509 transformqual :: { Located ([LStmt RdrName] -> Stmt RdrName) }
1510                         -- Function is applied to a list of stmts *in order*
1511     : 'then' exp                { LL $ \leftStmts -> (mkTransformStmt leftStmts $2) }
1512     -- >>>
1513     | 'then' exp 'by' exp       { LL $ \leftStmts -> (mkTransformByStmt leftStmts $2 $4) }
1514     | 'then' 'group' 'by' exp   { LL $ \leftStmts -> (mkGroupByStmt leftStmts $4) }
1515     -- <<<
1516     -- These two productions deliberately have a shift-reduce conflict. I have made 'group' into a special_id,
1517     -- which means you can enable TransformListComp while still using Data.List.group. However, this makes the two
1518     -- productions ambiguous. I've set things up so that Happy chooses to resolve the conflict in that case by
1519     -- choosing the "group by" variant, which is what we want.
1520     --
1521     -- This is rather dubious: the user might be confused as to how to parse this statement. However, it is a good
1522     -- practical choice. NB: Data.List.group :: [a] -> [[a]], so using the first production would not even type check
1523     -- if /that/ is the group function we conflict with.
1524     | 'then' 'group' 'using' exp           { LL $ \leftStmts -> (mkGroupUsingStmt leftStmts $4) }
1525     | 'then' 'group' 'by' exp 'using' exp  { LL $ \leftStmts -> (mkGroupByUsingStmt leftStmts $4 $6) }
1526
1527 -----------------------------------------------------------------------------
1528 -- Parallel array expressions
1529
1530 -- The rules below are little bit contorted; see the list case for details.
1531 -- Note that, in contrast to lists, we only have finite arithmetic sequences.
1532 -- Moreover, we allow explicit arrays with no element (represented by the nil
1533 -- constructor in the list case).
1534
1535 parr :: { LHsExpr RdrName }
1536         :                               { noLoc (ExplicitPArr placeHolderType []) }
1537         | texp                          { L1 $ ExplicitPArr placeHolderType [$1] }
1538         | lexps                         { L1 $ ExplicitPArr placeHolderType 
1539                                                        (reverse (unLoc $1)) }
1540         | texp '..' exp                 { LL $ PArrSeq noPostTcExpr (FromTo $1 $3) }
1541         | texp ',' exp '..' exp         { LL $ PArrSeq noPostTcExpr (FromThenTo $1 $3 $5) }
1542         | texp '|' flattenedpquals      { LL $ mkHsDo PArrComp (unLoc $3) $1 }
1543
1544 -- We are reusing `lexps' and `flattenedpquals' from the list case.
1545
1546 -----------------------------------------------------------------------------
1547 -- Guards
1548
1549 guardquals :: { Located [LStmt RdrName] }
1550     : guardquals1           { L (getLoc $1) (reverse (unLoc $1)) }
1551
1552 guardquals1 :: { Located [LStmt RdrName] }
1553     : guardquals1 ',' qual  { LL ($3 : unLoc $1) }
1554     | qual                  { L1 [$1] }
1555
1556 -----------------------------------------------------------------------------
1557 -- Case alternatives
1558
1559 altslist :: { Located [LMatch RdrName] }
1560         : '{'            alts '}'       { LL (reverse (unLoc $2)) }
1561         |     vocurly    alts  close    { L (getLoc $2) (reverse (unLoc $2)) }
1562
1563 alts    :: { Located [LMatch RdrName] }
1564         : alts1                         { L1 (unLoc $1) }
1565         | ';' alts                      { LL (unLoc $2) }
1566
1567 alts1   :: { Located [LMatch RdrName] }
1568         : alts1 ';' alt                 { LL ($3 : unLoc $1) }
1569         | alts1 ';'                     { LL (unLoc $1) }
1570         | alt                           { L1 [$1] }
1571
1572 alt     :: { LMatch RdrName }
1573         : pat opt_sig alt_rhs           { LL (Match [$1] $2 (unLoc $3)) }
1574
1575 alt_rhs :: { Located (GRHSs RdrName) }
1576         : ralt wherebinds               { LL (GRHSs (unLoc $1) (unLoc $2)) }
1577
1578 ralt :: { Located [LGRHS RdrName] }
1579         : '->' exp                      { LL (unguardedRHS $2) }
1580         | gdpats                        { L1 (reverse (unLoc $1)) }
1581
1582 gdpats :: { Located [LGRHS RdrName] }
1583         : gdpats gdpat                  { LL ($2 : unLoc $1) }
1584         | gdpat                         { L1 [$1] }
1585
1586 gdpat   :: { LGRHS RdrName }
1587         : '|' guardquals '->' exp               { sL (comb2 $1 $>) $ GRHS (unLoc $2) $4 }
1588
1589 -- 'pat' recognises a pattern, including one with a bang at the top
1590 --      e.g.  "!x" or "!(x,y)" or "C a b" etc
1591 -- Bangs inside are parsed as infix operator applications, so that
1592 -- we parse them right when bang-patterns are off
1593 pat     :: { LPat RdrName }
1594 pat     :  exp                  {% checkPattern $1 }
1595         | '!' aexp              {% checkPattern (LL (SectionR (L1 (HsVar bang_RDR)) $2)) }
1596
1597 apat   :: { LPat RdrName }      
1598 apat    : aexp                  {% checkPattern $1 }
1599         | '!' aexp              {% checkPattern (LL (SectionR (L1 (HsVar bang_RDR)) $2)) }
1600
1601 apats  :: { [LPat RdrName] }
1602         : apat apats            { $1 : $2 }
1603         | {- empty -}           { [] }
1604
1605 -----------------------------------------------------------------------------
1606 -- Statement sequences
1607
1608 stmtlist :: { Located [LStmt RdrName] }
1609         : '{'           stmts '}'       { LL (unLoc $2) }
1610         |     vocurly   stmts close     { $2 }
1611
1612 --      do { ;; s ; s ; ; s ;; }
1613 -- The last Stmt should be an expression, but that's hard to enforce
1614 -- here, because we need too much lookahead if we see do { e ; }
1615 -- So we use ExprStmts throughout, and switch the last one over
1616 -- in ParseUtils.checkDo instead
1617 stmts :: { Located [LStmt RdrName] }
1618         : stmt stmts_help               { LL ($1 : unLoc $2) }
1619         | ';' stmts                     { LL (unLoc $2) }
1620         | {- empty -}                   { noLoc [] }
1621
1622 stmts_help :: { Located [LStmt RdrName] } -- might be empty
1623         : ';' stmts                     { LL (unLoc $2) }
1624         | {- empty -}                   { noLoc [] }
1625
1626 -- For typing stmts at the GHCi prompt, where 
1627 -- the input may consist of just comments.
1628 maybe_stmt :: { Maybe (LStmt RdrName) }
1629         : stmt                          { Just $1 }
1630         | {- nothing -}                 { Nothing }
1631
1632 stmt  :: { LStmt RdrName }
1633         : qual                              { $1 }
1634         | 'rec' stmtlist                { LL $ mkRecStmt (unLoc $2) }
1635
1636 qual  :: { LStmt RdrName }
1637     : pat '<-' exp                      { LL $ mkBindStmt $1 $3 }
1638     | exp                                   { L1 $ mkExprStmt $1 }
1639     | 'let' binds                       { LL $ LetStmt (unLoc $2) }
1640
1641 -----------------------------------------------------------------------------
1642 -- Record Field Update/Construction
1643
1644 fbinds  :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
1645         : fbinds1                       { $1 }
1646         | {- empty -}                   { ([], False) }
1647
1648 fbinds1 :: { ([HsRecField RdrName (LHsExpr RdrName)], Bool) }
1649         : fbind ',' fbinds1             { case $3 of (flds, dd) -> ($1 : flds, dd) } 
1650         | fbind                         { ([$1], False) }
1651         | '..'                          { ([],   True) }
1652   
1653 fbind   :: { HsRecField RdrName (LHsExpr RdrName) }
1654         : qvar '=' exp  { HsRecField $1 $3                False }
1655         | qvar          { HsRecField $1 placeHolderPunRhs True }
1656                         -- In the punning case, use a place-holder
1657                         -- The renamer fills in the final value
1658
1659 -----------------------------------------------------------------------------
1660 -- Implicit Parameter Bindings
1661
1662 dbinds  :: { Located [LIPBind RdrName] }
1663         : dbinds ';' dbind              { let { this = $3; rest = unLoc $1 }
1664                               in rest `seq` this `seq` LL (this : rest) }
1665         | dbinds ';'                    { LL (unLoc $1) }
1666         | dbind                         { let this = $1 in this `seq` L1 [this] }
1667 --      | {- empty -}                   { [] }
1668
1669 dbind   :: { LIPBind RdrName }
1670 dbind   : ipvar '=' exp                 { LL (IPBind (unLoc $1) $3) }
1671
1672 ipvar   :: { Located (IPName RdrName) }
1673         : IPDUPVARID            { L1 (IPName (mkUnqual varName (getIPDUPVARID $1))) }
1674
1675 -----------------------------------------------------------------------------
1676 -- Warnings and deprecations
1677
1678 namelist :: { Located [RdrName] }
1679 namelist : name_var              { L1 [unLoc $1] }
1680          | name_var ',' namelist { LL (unLoc $1 : unLoc $3) }
1681
1682 name_var :: { Located RdrName }
1683 name_var : var { $1 }
1684          | con { $1 }
1685
1686 -----------------------------------------
1687 -- Data constructors
1688 qcon    :: { Located RdrName }
1689         : qconid                { $1 }
1690         | '(' qconsym ')'       { LL (unLoc $2) }
1691         | sysdcon               { L1 $ nameRdrName (dataConName (unLoc $1)) }
1692 -- The case of '[:' ':]' is part of the production `parr'
1693
1694 con     :: { Located RdrName }
1695         : conid                 { $1 }
1696         | '(' consym ')'        { LL (unLoc $2) }
1697         | sysdcon               { L1 $ nameRdrName (dataConName (unLoc $1)) }
1698
1699 con_list :: { Located [Located RdrName] }
1700 con_list : con                  { L1 [$1] }
1701          | con ',' con_list     { LL ($1 : unLoc $3) }
1702
1703 sysdcon :: { Located DataCon }  -- Wired in data constructors
1704         : '(' ')'               { LL unitDataCon }
1705         | '(' commas ')'        { LL $ tupleCon Boxed ($2 + 1) }
1706         | '(#' '#)'             { LL $ unboxedSingletonDataCon }
1707         | '(#' commas '#)'      { LL $ tupleCon Unboxed ($2 + 1) }
1708         | '[' ']'               { LL nilDataCon }
1709
1710 conop :: { Located RdrName }
1711         : consym                { $1 }  
1712         | '`' conid '`'         { LL (unLoc $2) }
1713
1714 qconop :: { Located RdrName }
1715         : qconsym               { $1 }
1716         | '`' qconid '`'        { LL (unLoc $2) }
1717
1718 -----------------------------------------------------------------------------
1719 -- Type constructors
1720
1721 gtycon  :: { Located RdrName }  -- A "general" qualified tycon
1722         : oqtycon                       { $1 }
1723         | '(' ')'                       { LL $ getRdrName unitTyCon }
1724         | '(' commas ')'                { LL $ getRdrName (tupleTyCon Boxed ($2 + 1)) }
1725         | '(#' '#)'                     { LL $ getRdrName unboxedSingletonTyCon }
1726         | '(#' commas '#)'              { LL $ getRdrName (tupleTyCon Unboxed ($2 + 1)) }
1727         | '(' '->' ')'                  { LL $ getRdrName funTyCon }
1728         | '[' ']'                       { LL $ listTyCon_RDR }
1729         | '[:' ':]'                     { LL $ parrTyCon_RDR }
1730
1731 oqtycon :: { Located RdrName }  -- An "ordinary" qualified tycon
1732         : qtycon                        { $1 }
1733         | '(' qtyconsym ')'             { LL (unLoc $2) }
1734
1735 qtyconop :: { Located RdrName } -- Qualified or unqualified
1736         : qtyconsym                     { $1 }
1737         | '`' qtycon '`'                { LL (unLoc $2) }
1738
1739 qtycon :: { Located RdrName }   -- Qualified or unqualified
1740         : QCONID                        { L1 $! mkQual tcClsName (getQCONID $1) }
1741         | PREFIXQCONSYM                 { L1 $! mkQual tcClsName (getPREFIXQCONSYM $1) }
1742         | tycon                         { $1 }
1743
1744 tycon   :: { Located RdrName }  -- Unqualified
1745         : CONID                         { L1 $! mkUnqual tcClsName (getCONID $1) }
1746
1747 qtyconsym :: { Located RdrName }
1748         : QCONSYM                       { L1 $! mkQual tcClsName (getQCONSYM $1) }
1749         | tyconsym                      { $1 }
1750
1751 tyconsym :: { Located RdrName }
1752         : CONSYM                        { L1 $! mkUnqual tcClsName (getCONSYM $1) }
1753
1754 -----------------------------------------------------------------------------
1755 -- Operators
1756
1757 op      :: { Located RdrName }   -- used in infix decls
1758         : varop                 { $1 }
1759         | conop                 { $1 }
1760
1761 varop   :: { Located RdrName }
1762         : varsym                { $1 }
1763         | '`' varid '`'         { LL (unLoc $2) }
1764
1765 qop     :: { LHsExpr RdrName }   -- used in sections
1766         : qvarop                { L1 $ HsVar (unLoc $1) }
1767         | qconop                { L1 $ HsVar (unLoc $1) }
1768
1769 qopm    :: { LHsExpr RdrName }   -- used in sections
1770         : qvaropm               { L1 $ HsVar (unLoc $1) }
1771         | qconop                { L1 $ HsVar (unLoc $1) }
1772
1773 qvarop :: { Located RdrName }
1774         : qvarsym               { $1 }
1775         | '`' qvarid '`'        { LL (unLoc $2) }
1776
1777 qvaropm :: { Located RdrName }
1778         : qvarsym_no_minus      { $1 }
1779         | '`' qvarid '`'        { LL (unLoc $2) }
1780
1781 -----------------------------------------------------------------------------
1782 -- Type variables
1783
1784 tyvar   :: { Located RdrName }
1785 tyvar   : tyvarid               { $1 }
1786         | '(' tyvarsym ')'      { LL (unLoc $2) }
1787
1788 tyvarop :: { Located RdrName }
1789 tyvarop : '`' tyvarid '`'       { LL (unLoc $2) }
1790         | tyvarsym              { $1 }
1791         | '.'                   {% parseErrorSDoc (getLoc $1) 
1792                                       (vcat [ptext (sLit "Illegal symbol '.' in type"), 
1793                                              ptext (sLit "Perhaps you intended -XRankNTypes or similar flag"),
1794                                              ptext (sLit "to enable explicit-forall syntax: forall <tvs>. <type>")])
1795                                 }
1796
1797 tyvarid :: { Located RdrName }
1798         : VARID                 { L1 $! mkUnqual tvName (getVARID $1) }
1799         | special_id            { L1 $! mkUnqual tvName (unLoc $1) }
1800         | 'unsafe'              { L1 $! mkUnqual tvName (fsLit "unsafe") }
1801         | 'safe'                { L1 $! mkUnqual tvName (fsLit "safe") }
1802         | 'interruptible'       { L1 $! mkUnqual tvName (fsLit "interruptible") }
1803         | 'threadsafe'          { L1 $! mkUnqual tvName (fsLit "threadsafe") }
1804
1805 tyvarsym :: { Located RdrName }
1806 -- Does not include "!", because that is used for strictness marks
1807 --               or ".", because that separates the quantified type vars from the rest
1808 --               or "*", because that's used for kinds
1809 tyvarsym : VARSYM               { L1 $! mkUnqual tvName (getVARSYM $1) }
1810
1811 -----------------------------------------------------------------------------
1812 -- Variables 
1813
1814 var     :: { Located RdrName }
1815         : varid                 { $1 }
1816         | '(' varsym ')'        { LL (unLoc $2) }
1817
1818 qvar    :: { Located RdrName }
1819         : qvarid                { $1 }
1820         | '(' varsym ')'        { LL (unLoc $2) }
1821         | '(' qvarsym1 ')'      { LL (unLoc $2) }
1822 -- We've inlined qvarsym here so that the decision about
1823 -- whether it's a qvar or a var can be postponed until
1824 -- *after* we see the close paren.
1825
1826 qvarid :: { Located RdrName }
1827         : varid                 { $1 }
1828         | QVARID                { L1 $! mkQual varName (getQVARID $1) }
1829         | PREFIXQVARSYM         { L1 $! mkQual varName (getPREFIXQVARSYM $1) }
1830
1831 varid :: { Located RdrName }
1832         : VARID                 { L1 $! mkUnqual varName (getVARID $1) }
1833         | special_id            { L1 $! mkUnqual varName (unLoc $1) }
1834         | 'unsafe'              { L1 $! mkUnqual varName (fsLit "unsafe") }
1835         | 'safe'                { L1 $! mkUnqual varName (fsLit "safe") }
1836         | 'interruptible'       { L1 $! mkUnqual varName (fsLit "interruptible") }
1837         | 'threadsafe'          { L1 $! mkUnqual varName (fsLit "threadsafe") }
1838         | 'forall'              { L1 $! mkUnqual varName (fsLit "forall") }
1839         | 'family'              { L1 $! mkUnqual varName (fsLit "family") }
1840
1841 qvarsym :: { Located RdrName }
1842         : varsym                { $1 }
1843         | qvarsym1              { $1 }
1844
1845 qvarsym_no_minus :: { Located RdrName }
1846         : varsym_no_minus       { $1 }
1847         | qvarsym1              { $1 }
1848
1849 qvarsym1 :: { Located RdrName }
1850 qvarsym1 : QVARSYM              { L1 $ mkQual varName (getQVARSYM $1) }
1851
1852 varsym :: { Located RdrName }
1853         : varsym_no_minus       { $1 }
1854         | '-'                   { L1 $ mkUnqual varName (fsLit "-") }
1855
1856 varsym_no_minus :: { Located RdrName } -- varsym not including '-'
1857         : VARSYM                { L1 $ mkUnqual varName (getVARSYM $1) }
1858         | special_sym           { L1 $ mkUnqual varName (unLoc $1) }
1859
1860
1861 -- These special_ids are treated as keywords in various places, 
1862 -- but as ordinary ids elsewhere.   'special_id' collects all these
1863 -- except 'unsafe', 'interruptible', 'forall', and 'family' whose treatment differs
1864 -- depending on context 
1865 special_id :: { Located FastString }
1866 special_id
1867         : 'as'                  { L1 (fsLit "as") }
1868         | 'qualified'           { L1 (fsLit "qualified") }
1869         | 'hiding'              { L1 (fsLit "hiding") }
1870         | 'export'              { L1 (fsLit "export") }
1871         | 'label'               { L1 (fsLit "label")  }
1872         | 'dynamic'             { L1 (fsLit "dynamic") }
1873         | 'stdcall'             { L1 (fsLit "stdcall") }
1874         | 'ccall'               { L1 (fsLit "ccall") }
1875         | 'prim'                { L1 (fsLit "prim") }
1876         | 'group'               { L1 (fsLit "group") }
1877
1878 special_sym :: { Located FastString }
1879 special_sym : '!'       { L1 (fsLit "!") }
1880             | '.'       { L1 (fsLit ".") }
1881             | '*'       { L1 (fsLit "*") }
1882
1883 -----------------------------------------------------------------------------
1884 -- Data constructors
1885
1886 qconid :: { Located RdrName }   -- Qualified or unqualified
1887         : conid                 { $1 }
1888         | QCONID                { L1 $! mkQual dataName (getQCONID $1) }
1889         | PREFIXQCONSYM         { L1 $! mkQual dataName (getPREFIXQCONSYM $1) }
1890
1891 conid   :: { Located RdrName }
1892         : CONID                 { L1 $ mkUnqual dataName (getCONID $1) }
1893
1894 qconsym :: { Located RdrName }  -- Qualified or unqualified
1895         : consym                { $1 }
1896         | QCONSYM               { L1 $ mkQual dataName (getQCONSYM $1) }
1897
1898 consym :: { Located RdrName }
1899         : CONSYM                { L1 $ mkUnqual dataName (getCONSYM $1) }
1900
1901         -- ':' means only list cons
1902         | ':'                   { L1 $ consDataCon_RDR }
1903
1904
1905 -----------------------------------------------------------------------------
1906 -- Literals
1907
1908 literal :: { Located HsLit }
1909         : CHAR                  { L1 $ HsChar       $ getCHAR $1 }
1910         | STRING                { L1 $ HsString     $ getSTRING $1 }
1911         | PRIMINTEGER           { L1 $ HsIntPrim    $ getPRIMINTEGER $1 }
1912         | PRIMWORD              { L1 $ HsWordPrim    $ getPRIMWORD $1 }
1913         | PRIMCHAR              { L1 $ HsCharPrim   $ getPRIMCHAR $1 }
1914         | PRIMSTRING            { L1 $ HsStringPrim $ getPRIMSTRING $1 }
1915         | PRIMFLOAT             { L1 $ HsFloatPrim  $ getPRIMFLOAT $1 }
1916         | PRIMDOUBLE            { L1 $ HsDoublePrim $ getPRIMDOUBLE $1 }
1917
1918 -----------------------------------------------------------------------------
1919 -- Layout
1920
1921 close :: { () }
1922         : vccurly               { () } -- context popped in lexer.
1923         | error                 {% popContext }
1924
1925 -----------------------------------------------------------------------------
1926 -- Miscellaneous (mostly renamings)
1927
1928 modid   :: { Located ModuleName }
1929         : CONID                 { L1 $ mkModuleNameFS (getCONID $1) }
1930         | QCONID                { L1 $ let (mod,c) = getQCONID $1 in
1931                                   mkModuleNameFS
1932                                    (mkFastString
1933                                      (unpackFS mod ++ '.':unpackFS c))
1934                                 }
1935
1936 commas :: { Int }
1937         : commas ','                    { $1 + 1 }
1938         | ','                           { 1 }
1939
1940 -----------------------------------------------------------------------------
1941 -- Documentation comments
1942
1943 docnext :: { LHsDocString }
1944   : DOCNEXT {% return (L1 (HsDocString (mkFastString (getDOCNEXT $1)))) }
1945
1946 docprev :: { LHsDocString }
1947   : DOCPREV {% return (L1 (HsDocString (mkFastString (getDOCPREV $1)))) }
1948
1949 docnamed :: { Located (String, HsDocString) }
1950   : DOCNAMED {%
1951       let string = getDOCNAMED $1 
1952           (name, rest) = break isSpace string
1953       in return (L1 (name, HsDocString (mkFastString rest))) }
1954
1955 docsection :: { Located (Int, HsDocString) }
1956   : DOCSECTION {% let (n, doc) = getDOCSECTION $1 in
1957         return (L1 (n, HsDocString (mkFastString doc))) }
1958
1959 moduleheader :: { Maybe LHsDocString }
1960         : DOCNEXT {% let string = getDOCNEXT $1 in
1961                      return (Just (L1 (HsDocString (mkFastString string)))) }
1962
1963 maybe_docprev :: { Maybe LHsDocString }
1964         : docprev                       { Just $1 }
1965         | {- empty -}                   { Nothing }
1966
1967 maybe_docnext :: { Maybe LHsDocString }
1968         : docnext                       { Just $1 }
1969         | {- empty -}                   { Nothing }
1970
1971 {
1972 happyError :: P a
1973 happyError = srcParseFail
1974
1975 getVARID        (L _ (ITvarid    x)) = x
1976 getCONID        (L _ (ITconid    x)) = x
1977 getVARSYM       (L _ (ITvarsym   x)) = x
1978 getCONSYM       (L _ (ITconsym   x)) = x
1979 getQVARID       (L _ (ITqvarid   x)) = x
1980 getQCONID       (L _ (ITqconid   x)) = x
1981 getQVARSYM      (L _ (ITqvarsym  x)) = x
1982 getQCONSYM      (L _ (ITqconsym  x)) = x
1983 getPREFIXQVARSYM (L _ (ITprefixqvarsym  x)) = x
1984 getPREFIXQCONSYM (L _ (ITprefixqconsym  x)) = x
1985 getIPDUPVARID   (L _ (ITdupipvarid   x)) = x
1986 getCHAR         (L _ (ITchar     x)) = x
1987 getSTRING       (L _ (ITstring   x)) = x
1988 getINTEGER      (L _ (ITinteger  x)) = x
1989 getRATIONAL     (L _ (ITrational x)) = x
1990 getPRIMCHAR     (L _ (ITprimchar   x)) = x
1991 getPRIMSTRING   (L _ (ITprimstring x)) = x
1992 getPRIMINTEGER  (L _ (ITprimint    x)) = x
1993 getPRIMWORD     (L _ (ITprimword x)) = x
1994 getPRIMFLOAT    (L _ (ITprimfloat  x)) = x
1995 getPRIMDOUBLE   (L _ (ITprimdouble x)) = x
1996 getTH_ID_SPLICE (L _ (ITidEscape x)) = x
1997 getINLINE       (L _ (ITinline_prag inl conl)) = (inl,conl)
1998 getSPEC_INLINE  (L _ (ITspec_inline_prag True))  = (Inline,  FunLike)
1999 getSPEC_INLINE  (L _ (ITspec_inline_prag False)) = (NoInline,FunLike)
2000
2001 getDOCNEXT (L _ (ITdocCommentNext x)) = x
2002 getDOCPREV (L _ (ITdocCommentPrev x)) = x
2003 getDOCNAMED (L _ (ITdocCommentNamed x)) = x
2004 getDOCSECTION (L _ (ITdocSection n x)) = (n, x)
2005
2006 getSCC :: Located Token -> P FastString
2007 getSCC lt = do let s = getSTRING lt
2008                    err = "Spaces are not allowed in SCCs"
2009                -- We probably actually want to be more restrictive than this
2010                if ' ' `elem` unpackFS s
2011                    then failSpanMsgP (getLoc lt) (text err)
2012                    else return s
2013
2014 -- Utilities for combining source spans
2015 comb2 :: Located a -> Located b -> SrcSpan
2016 comb2 a b = a `seq` b `seq` combineLocs a b
2017
2018 comb3 :: Located a -> Located b -> Located c -> SrcSpan
2019 comb3 a b c = a `seq` b `seq` c `seq`
2020     combineSrcSpans (getLoc a) (combineSrcSpans (getLoc b) (getLoc c))
2021
2022 comb4 :: Located a -> Located b -> Located c -> Located d -> SrcSpan
2023 comb4 a b c d = a `seq` b `seq` c `seq` d `seq`
2024     (combineSrcSpans (getLoc a) $ combineSrcSpans (getLoc b) $
2025                 combineSrcSpans (getLoc c) (getLoc d))
2026
2027 -- strict constructor version:
2028 {-# INLINE sL #-}
2029 sL :: SrcSpan -> a -> Located a
2030 sL span a = span `seq` a `seq` L span a
2031
2032 -- Make a source location for the file.  We're a bit lazy here and just
2033 -- make a point SrcSpan at line 1, column 0.  Strictly speaking we should
2034 -- try to find the span of the whole file (ToDo).
2035 fileSrcSpan :: P SrcSpan
2036 fileSrcSpan = do 
2037   l <- getSrcLoc; 
2038   let loc = mkSrcLoc (srcLocFile l) 1 1;
2039   return (mkSrcSpan loc loc)
2040 }