[project @ 2005-10-14 11:22:41 by simonpj]
[ghc-hetmet.git] / ghc / 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 module Parser ( parseModule, parseStmt, parseIdentifier, parseType,
12                 parseHeader ) where
13
14 #define INCLUDE #include 
15 INCLUDE "HsVersions.h"
16
17 import HsSyn
18 import RdrHsSyn
19 import HscTypes         ( IsBootInterface, DeprecTxt )
20 import Lexer
21 import RdrName
22 import TysWiredIn       ( unitTyCon, unitDataCon, tupleTyCon, tupleCon, nilDataCon,
23                           listTyCon_RDR, parrTyCon_RDR, consDataCon_RDR )
24 import Type             ( funTyCon )
25 import ForeignCall      ( Safety(..), CExportSpec(..), CLabelString,
26                           CCallConv(..), CCallTarget(..), defaultCCallConv
27                         )
28 import OccName          ( UserFS, varName, dataName, tcClsName, tvName )
29 import DataCon          ( DataCon, dataConName )
30 import SrcLoc           ( Located(..), unLoc, getLoc, noLoc, combineSrcSpans,
31                           SrcSpan, combineLocs, srcLocFile, 
32                           mkSrcLoc, mkSrcSpan )
33 import Module
34 import StaticFlags      ( opt_SccProfilingOn )
35 import Type             ( Kind, mkArrowKind, liftedTypeKind )
36 import BasicTypes       ( Boxity(..), Fixity(..), FixityDirection(..), IPName(..),
37                           Activation(..) )
38 import OrdList
39 import Panic
40
41 import FastString
42 import Maybes           ( orElse )
43 import Outputable
44 import GLAEXTS
45 }
46
47 {-
48 -----------------------------------------------------------------------------
49 Conflicts: 36 shift/reduce (1.25)
50
51 10 for abiguity in 'if x then y else z + 1'             [State 178]
52         (shift parses as 'if x then y else (z + 1)', as per longest-parse rule)
53         10 because op might be: : - ! * . `x` VARSYM CONSYM QVARSYM QCONSYM
54
55 1 for ambiguity in 'if x then y else z :: T'            [State 178]
56         (shift parses as 'if x then y else (z :: T)', as per longest-parse rule)
57
58 4 for ambiguity in 'if x then y else z -< e'            [State 178]
59         (shift parses as 'if x then y else (z -< T)', as per longest-parse rule)
60         There are four such operators: -<, >-, -<<, >>-
61
62
63 2 for ambiguity in 'case v of { x :: T -> T ... } '     [States 11, 253]
64         Which of these two is intended?
65           case v of
66             (x::T) -> T         -- Rhs is T
67     or
68           case v of
69             (x::T -> T) -> ..   -- Rhs is ...
70
71 10 for ambiguity in 'e :: a `b` c'.  Does this mean     [States 11, 253]
72         (e::a) `b` c, or 
73         (e :: (a `b` c))
74     As well as `b` we can have !, VARSYM, QCONSYM, and CONSYM, hence 5 cases
75     Same duplication between states 11 and 253 as the previous case
76
77 1 for ambiguity in 'let ?x ...'                         [State 329]
78         the parser can't tell whether the ?x is the lhs of a normal binding or
79         an implicit binding.  Fortunately resolving as shift gives it the only
80         sensible meaning, namely the lhs of an implicit binding.
81
82 1 for ambiguity in '{-# RULES "name" [ ... #-}          [State 382]
83         we don't know whether the '[' starts the activation or not: it
84         might be the start of the declaration with the activation being
85         empty.  --SDM 1/4/2002
86
87 6 for conflicts between `fdecl' and `fdeclDEPRECATED',  [States 393,394]
88         which are resolved correctly, and moreover, 
89         should go away when `fdeclDEPRECATED' is removed.
90
91 1 for ambiguity in '{-# RULES "name" forall = ... #-}'  [State 474]
92         since 'forall' is a valid variable name, we don't know whether
93         to treat a forall on the input as the beginning of a quantifier
94         or the beginning of the rule itself.  Resolving to shift means
95         it's always treated as a quantifier, hence the above is disallowed.
96         This saves explicitly defining a grammar for the rule lhs that
97         doesn't include 'forall'.
98
99 -- ---------------------------------------------------------------------------
100 -- Adding location info
101
102 This is done in a stylised way using the three macros below, L0, L1
103 and LL.  Each of these macros can be thought of as having type
104
105    L0, L1, LL :: a -> Located a
106
107 They each add a SrcSpan to their argument.
108
109    L0   adds 'noSrcSpan', used for empty productions
110
111    L1   for a production with a single token on the lhs.  Grabs the SrcSpan
112         from that token.
113
114    LL   for a production with >1 token on the lhs.  Makes up a SrcSpan from
115         the first and last tokens.
116
117 These suffice for the majority of cases.  However, we must be
118 especially careful with empty productions: LL won't work if the first
119 or last token on the lhs can represent an empty span.  In these cases,
120 we have to calculate the span using more of the tokens from the lhs, eg.
121
122         | 'newtype' tycl_hdr '=' newconstr deriving
123                 { L (comb3 $1 $4 $5)
124                     (mkTyData NewType (unLoc $2) [$4] (unLoc $5)) }
125
126 We provide comb3 and comb4 functions which are useful in such cases.
127
128 Be careful: there's no checking that you actually got this right, the
129 only symptom will be that the SrcSpans of your syntax will be
130 incorrect.
131
132 /*
133  * We must expand these macros *before* running Happy, which is why this file is
134  * Parser.y.pp rather than just Parser.y - we run the C pre-processor first.
135  */
136 #define L0   L noSrcSpan
137 #define L1   sL (getLoc $1)
138 #define LL   sL (comb2 $1 $>)
139
140 -- -----------------------------------------------------------------------------
141
142 -}
143
144 %token
145  '_'            { L _ ITunderscore }            -- Haskell keywords
146  'as'           { L _ ITas }
147  'case'         { L _ ITcase }          
148  'class'        { L _ ITclass } 
149  'data'         { L _ ITdata } 
150  'default'      { L _ ITdefault }
151  'deriving'     { L _ ITderiving }
152  'do'           { L _ ITdo }
153  'else'         { L _ ITelse }
154  'hiding'       { L _ IThiding }
155  'if'           { L _ ITif }
156  'import'       { L _ ITimport }
157  'in'           { L _ ITin }
158  'infix'        { L _ ITinfix }
159  'infixl'       { L _ ITinfixl }
160  'infixr'       { L _ ITinfixr }
161  'instance'     { L _ ITinstance }
162  'let'          { L _ ITlet }
163  'module'       { L _ ITmodule }
164  'newtype'      { L _ ITnewtype }
165  'of'           { L _ ITof }
166  'qualified'    { L _ ITqualified }
167  'then'         { L _ ITthen }
168  'type'         { L _ ITtype }
169  'where'        { L _ ITwhere }
170  '_scc_'        { L _ ITscc }         -- ToDo: remove
171
172  'forall'       { L _ ITforall }                        -- GHC extension keywords
173  'foreign'      { L _ ITforeign }
174  'export'       { L _ ITexport }
175  'label'        { L _ ITlabel } 
176  'dynamic'      { L _ ITdynamic }
177  'safe'         { L _ ITsafe }
178  'threadsafe'   { L _ ITthreadsafe }
179  'unsafe'       { L _ ITunsafe }
180  'mdo'          { L _ ITmdo }
181  'stdcall'      { L _ ITstdcallconv }
182  'ccall'        { L _ ITccallconv }
183  'dotnet'       { L _ ITdotnet }
184  'proc'         { L _ ITproc }          -- for arrow notation extension
185  'rec'          { L _ ITrec }           -- for arrow notation extension
186
187  '{-# SPECIALISE'  { L _ ITspecialise_prag }
188  '{-# SOURCE'      { L _ ITsource_prag }
189  '{-# INLINE'      { L _ ITinline_prag }
190  '{-# NOINLINE'    { L _ ITnoinline_prag }
191  '{-# RULES'       { L _ ITrules_prag }
192  '{-# CORE'        { L _ ITcore_prag }              -- hdaume: annotated core
193  '{-# SCC'         { L _ ITscc_prag }
194  '{-# DEPRECATED'  { L _ ITdeprecated_prag }
195  '{-# UNPACK'      { L _ ITunpack_prag }
196  '#-}'             { L _ ITclose_prag }
197
198  '..'           { L _ ITdotdot }                        -- reserved symbols
199  ':'            { L _ ITcolon }
200  '::'           { L _ ITdcolon }
201  '='            { L _ ITequal }
202  '\\'           { L _ ITlam }
203  '|'            { L _ ITvbar }
204  '<-'           { L _ ITlarrow }
205  '->'           { L _ ITrarrow }
206  '@'            { L _ ITat }
207  '~'            { L _ ITtilde }
208  '=>'           { L _ ITdarrow }
209  '-'            { L _ ITminus }
210  '!'            { L _ ITbang }
211  '*'            { L _ ITstar }
212  '-<'           { L _ ITlarrowtail }            -- for arrow notation
213  '>-'           { L _ ITrarrowtail }            -- for arrow notation
214  '-<<'          { L _ ITLarrowtail }            -- for arrow notation
215  '>>-'          { L _ ITRarrowtail }            -- for arrow notation
216  '.'            { L _ ITdot }
217
218  '{'            { L _ ITocurly }                        -- special symbols
219  '}'            { L _ ITccurly }
220  '{|'           { L _ ITocurlybar }
221  '|}'           { L _ ITccurlybar }
222  vocurly        { L _ ITvocurly } -- virtual open curly (from layout)
223  vccurly        { L _ ITvccurly } -- virtual close curly (from layout)
224  '['            { L _ ITobrack }
225  ']'            { L _ ITcbrack }
226  '[:'           { L _ ITopabrack }
227  ':]'           { L _ ITcpabrack }
228  '('            { L _ IToparen }
229  ')'            { L _ ITcparen }
230  '(#'           { L _ IToubxparen }
231  '#)'           { L _ ITcubxparen }
232  '(|'           { L _ IToparenbar }
233  '|)'           { L _ ITcparenbar }
234  ';'            { L _ ITsemi }
235  ','            { L _ ITcomma }
236  '`'            { L _ ITbackquote }
237
238  VARID          { L _ (ITvarid    _) }          -- identifiers
239  CONID          { L _ (ITconid    _) }
240  VARSYM         { L _ (ITvarsym   _) }
241  CONSYM         { L _ (ITconsym   _) }
242  QVARID         { L _ (ITqvarid   _) }
243  QCONID         { L _ (ITqconid   _) }
244  QVARSYM        { L _ (ITqvarsym  _) }
245  QCONSYM        { L _ (ITqconsym  _) }
246
247  IPDUPVARID     { L _ (ITdupipvarid   _) }              -- GHC extension
248  IPSPLITVARID   { L _ (ITsplitipvarid _) }              -- GHC extension
249
250  CHAR           { L _ (ITchar     _) }
251  STRING         { L _ (ITstring   _) }
252  INTEGER        { L _ (ITinteger  _) }
253  RATIONAL       { L _ (ITrational _) }
254                     
255  PRIMCHAR       { L _ (ITprimchar   _) }
256  PRIMSTRING     { L _ (ITprimstring _) }
257  PRIMINTEGER    { L _ (ITprimint    _) }
258  PRIMFLOAT      { L _ (ITprimfloat  _) }
259  PRIMDOUBLE     { L _ (ITprimdouble _) }
260                     
261 -- Template Haskell 
262 '[|'            { L _ ITopenExpQuote  }       
263 '[p|'           { L _ ITopenPatQuote  }      
264 '[t|'           { L _ ITopenTypQuote  }      
265 '[d|'           { L _ ITopenDecQuote  }      
266 '|]'            { L _ ITcloseQuote    }
267 TH_ID_SPLICE    { L _ (ITidEscape _)  }     -- $x
268 '$('            { L _ ITparenEscape   }     -- $( exp )
269 TH_VAR_QUOTE    { L _ ITvarQuote      }     -- 'x
270 TH_TY_QUOTE     { L _ ITtyQuote       }      -- ''T
271
272 %monad { P } { >>= } { return }
273 %lexer { lexer } { L _ ITeof }
274 %name parseModule module
275 %name parseStmt   maybe_stmt
276 %name parseIdentifier  identifier
277 %name parseType ctype
278 %partial parseHeader header
279 %tokentype { Located Token }
280 %%
281
282 -----------------------------------------------------------------------------
283 -- Identifiers; one of the entry points
284 identifier :: { Located RdrName }
285         : qvar                          { $1 }
286         | qcon                          { $1 }
287         | qvarop                        { $1 }
288         | qconop                        { $1 }
289
290 -----------------------------------------------------------------------------
291 -- Module Header
292
293 -- The place for module deprecation is really too restrictive, but if it
294 -- was allowed at its natural place just before 'module', we get an ugly
295 -- s/r conflict with the second alternative. Another solution would be the
296 -- introduction of a new pragma DEPRECATED_MODULE, but this is not very nice,
297 -- either, and DEPRECATED is only expected to be used by people who really
298 -- know what they are doing. :-)
299
300 module  :: { Located (HsModule RdrName) }
301         : 'module' modid maybemoddeprec maybeexports 'where' body 
302                 {% fileSrcSpan >>= \ loc ->
303                    return (L loc (HsModule (Just $2) $4 (fst $6) (snd $6) $3)) }
304         | missing_module_keyword top close
305                 {% fileSrcSpan >>= \ loc ->
306                    return (L loc (HsModule Nothing Nothing 
307                                 (fst $2) (snd $2) Nothing)) }
308
309 missing_module_keyword :: { () }
310         : {- empty -}                           {% pushCurrentContext }
311
312 maybemoddeprec :: { Maybe DeprecTxt }
313         : '{-# DEPRECATED' STRING '#-}'         { Just (getSTRING $2) }
314         |  {- empty -}                          { Nothing }
315
316 body    :: { ([LImportDecl RdrName], [LHsDecl RdrName]) }
317         :  '{'            top '}'               { $2 }
318         |      vocurly    top close             { $2 }
319
320 top     :: { ([LImportDecl RdrName], [LHsDecl RdrName]) }
321         : importdecls                           { (reverse $1,[]) }
322         | importdecls ';' cvtopdecls            { (reverse $1,$3) }
323         | cvtopdecls                            { ([],$1) }
324
325 cvtopdecls :: { [LHsDecl RdrName] }
326         : topdecls                              { cvTopDecls $1 }
327
328 -----------------------------------------------------------------------------
329 -- Module declaration & imports only
330
331 header  :: { Located (HsModule RdrName) }
332         : 'module' modid maybemoddeprec maybeexports 'where' header_body
333                 {% fileSrcSpan >>= \ loc ->
334                    return (L loc (HsModule (Just $2) $4 $6 [] $3)) }
335         | missing_module_keyword importdecls
336                 {% fileSrcSpan >>= \ loc ->
337                    return (L loc (HsModule Nothing Nothing $2 [] Nothing)) }
338
339 header_body :: { [LImportDecl RdrName] }
340         :  '{'            importdecls           { $2 }
341         |      vocurly    importdecls           { $2 }
342
343 -----------------------------------------------------------------------------
344 -- The Export List
345
346 maybeexports :: { Maybe [LIE RdrName] }
347         :  '(' exportlist ')'                   { Just $2 }
348         |  {- empty -}                          { Nothing }
349
350 exportlist :: { [LIE RdrName] }
351         :  exportlist ',' export                { $3 : $1 }
352         |  exportlist ','                       { $1 }
353         |  export                               { [$1]  }
354         |  {- empty -}                          { [] }
355
356    -- No longer allow things like [] and (,,,) to be exported
357    -- They are built in syntax, always available
358 export  :: { LIE RdrName }
359         :  qvar                         { L1 (IEVar (unLoc $1)) }
360         |  oqtycon                      { L1 (IEThingAbs (unLoc $1)) }
361         |  oqtycon '(' '..' ')'         { LL (IEThingAll (unLoc $1)) }
362         |  oqtycon '(' ')'              { LL (IEThingWith (unLoc $1) []) }
363         |  oqtycon '(' qcnames ')'      { LL (IEThingWith (unLoc $1) (reverse $3)) }
364         |  'module' modid               { LL (IEModuleContents (unLoc $2)) }
365
366 qcnames :: { [RdrName] }
367         :  qcnames ',' qcname                   { unLoc $3 : $1 }
368         |  qcname                               { [unLoc $1]  }
369
370 qcname  :: { Located RdrName }  -- Variable or data constructor
371         :  qvar                                 { $1 }
372         |  qcon                                 { $1 }
373
374 -----------------------------------------------------------------------------
375 -- Import Declarations
376
377 -- import decls can be *empty*, or even just a string of semicolons
378 -- whereas topdecls must contain at least one topdecl.
379
380 importdecls :: { [LImportDecl RdrName] }
381         : importdecls ';' importdecl            { $3 : $1 }
382         | importdecls ';'                       { $1 }
383         | importdecl                            { [ $1 ] }
384         | {- empty -}                           { [] }
385
386 importdecl :: { LImportDecl RdrName }
387         : 'import' maybe_src optqualified modid maybeas maybeimpspec 
388                 { L (comb4 $1 $4 $5 $6) (ImportDecl $4 $2 $3 (unLoc $5) (unLoc $6)) }
389
390 maybe_src :: { IsBootInterface }
391         : '{-# SOURCE' '#-}'                    { True }
392         | {- empty -}                           { False }
393
394 optqualified :: { Bool }
395         : 'qualified'                           { True  }
396         | {- empty -}                           { False }
397
398 maybeas :: { Located (Maybe Module) }
399         : 'as' modid                            { LL (Just (unLoc $2)) }
400         | {- empty -}                           { noLoc Nothing }
401
402 maybeimpspec :: { Located (Maybe (Bool, [LIE RdrName])) }
403         : impspec                               { L1 (Just (unLoc $1)) }
404         | {- empty -}                           { noLoc Nothing }
405
406 impspec :: { Located (Bool, [LIE RdrName]) }
407         :  '(' exportlist ')'                   { LL (False, reverse $2) }
408         |  'hiding' '(' exportlist ')'          { LL (True,  reverse $3) }
409
410 -----------------------------------------------------------------------------
411 -- Fixity Declarations
412
413 prec    :: { Int }
414         : {- empty -}           { 9 }
415         | INTEGER               {% checkPrecP (L1 (fromInteger (getINTEGER $1))) }
416
417 infix   :: { Located FixityDirection }
418         : 'infix'                               { L1 InfixN  }
419         | 'infixl'                              { L1 InfixL  }
420         | 'infixr'                              { L1 InfixR }
421
422 ops     :: { Located [Located RdrName] }
423         : ops ',' op                            { LL ($3 : unLoc $1) }
424         | op                                    { L1 [$1] }
425
426 -----------------------------------------------------------------------------
427 -- Top-Level Declarations
428
429 topdecls :: { OrdList (LHsDecl RdrName) }       -- Reversed
430         : topdecls ';' topdecl          { $1 `appOL` $3 }
431         | topdecls ';'                  { $1 }
432         | topdecl                       { $1 }
433
434 topdecl :: { OrdList (LHsDecl RdrName) }
435         : tycl_decl                     { unitOL (L1 (TyClD (unLoc $1))) }
436         | 'instance' inst_type where
437                 { let (binds,sigs) = cvBindsAndSigs (unLoc $3)
438                   in unitOL (L (comb3 $1 $2 $3) (InstD (InstDecl $2 binds sigs))) }
439         | 'default' '(' comma_types0 ')'        { unitOL (LL $ DefD (DefaultDecl $3)) }
440         | 'foreign' fdecl                       { unitOL (LL (unLoc $2)) }
441         | '{-# DEPRECATED' deprecations '#-}'   { $2 }
442         | '{-# RULES' rules '#-}'               { $2 }
443         | '$(' exp ')'                          { unitOL (LL $ SpliceD (SpliceDecl $2)) }
444         | decl                                  { unLoc $1 }
445
446 tycl_decl :: { LTyClDecl RdrName }
447         : 'type' type '=' ctype 
448                 -- Note type on the left of the '='; this allows
449                 -- infix type constructors to be declared
450                 -- 
451                 -- Note ctype, not sigtype, on the right
452                 -- We allow an explicit for-all but we don't insert one
453                 -- in   type Foo a = (b,b)
454                 -- Instead we just say b is out of scope
455                 {% do { (tc,tvs) <- checkSynHdr $2
456                       ; return (LL (TySynonym tc tvs $4)) } }
457
458         | 'data' tycl_hdr constrs deriving
459                 { L (comb4 $1 $2 $3 $4) -- We need the location on tycl_hdr 
460                                         -- in case constrs and deriving are both empty
461                     (mkTyData DataType $2 Nothing (reverse (unLoc $3)) (unLoc $4)) }
462
463         | 'data' tycl_hdr opt_kind_sig 
464                  'where' gadt_constrlist
465                  deriving
466                 { L (comb4 $1 $2 $4 $5)
467                     (mkTyData DataType $2 $3 (reverse (unLoc $5)) (unLoc $6)) }
468
469         | 'newtype' tycl_hdr '=' newconstr deriving
470                 { L (comb3 $1 $4 $5)
471                     (mkTyData NewType $2 Nothing [$4] (unLoc $5)) }
472
473         | 'class' tycl_hdr fds where
474                 { let 
475                         (binds,sigs) = cvBindsAndSigs (unLoc $4)
476                   in
477                   L (comb4 $1 $2 $3 $4) (mkClassDecl (unLoc $2) (unLoc $3) sigs 
478                                           binds) }
479
480 opt_kind_sig :: { Maybe Kind }
481         :                               { Nothing }
482         | '::' kind                     { Just $2 }
483
484 -- tycl_hdr parses the header of a type or class decl,
485 -- which takes the form
486 --      T a b
487 --      Eq a => T a
488 --      (Eq a, Ord b) => T a b
489 -- Rather a lot of inlining here, else we get reduce/reduce errors
490 tycl_hdr :: { Located (LHsContext RdrName, Located RdrName, [LHsTyVarBndr RdrName]) }
491         : context '=>' type             {% checkTyClHdr $1         $3 >>= return.LL }
492         | type                          {% checkTyClHdr (noLoc []) $1 >>= return.L1 }
493
494 -----------------------------------------------------------------------------
495 -- Nested declarations
496
497 decls   :: { Located (OrdList (LHsDecl RdrName)) }      -- Reversed
498         : decls ';' decl                { LL (unLoc $1 `appOL` unLoc $3) }
499         | decls ';'                     { LL (unLoc $1) }
500         | decl                          { $1 }
501         | {- empty -}                   { noLoc nilOL }
502
503
504 decllist :: { Located (OrdList (LHsDecl RdrName)) }     -- Reversed
505         : '{'            decls '}'      { LL (unLoc $2) }
506         |     vocurly    decls close    { $2 }
507
508 where   :: { Located (OrdList (LHsDecl RdrName)) }      -- Reversed
509                                 -- No implicit parameters
510         : 'where' decllist              { LL (unLoc $2) }
511         | {- empty -}                   { noLoc nilOL }
512
513 binds   ::  { Located (HsLocalBinds RdrName) }          -- May have implicit parameters
514         : decllist                      { L1 (HsValBinds (cvBindGroup (unLoc $1))) }
515         | '{'            dbinds '}'     { LL (HsIPBinds (IPBinds (unLoc $2) emptyLHsBinds)) }
516         |     vocurly    dbinds close   { L (getLoc $2) (HsIPBinds (IPBinds (unLoc $2) emptyLHsBinds)) }
517
518 wherebinds :: { Located (HsLocalBinds RdrName) }        -- May have implicit parameters
519         : 'where' binds                 { LL (unLoc $2) }
520         | {- empty -}                   { noLoc emptyLocalBinds }
521
522
523 -----------------------------------------------------------------------------
524 -- Transformation Rules
525
526 rules   :: { OrdList (LHsDecl RdrName) }        -- Reversed
527         :  rules ';' rule                       { $1 `snocOL` $3 }
528         |  rules ';'                            { $1 }
529         |  rule                                 { unitOL $1 }
530         |  {- empty -}                          { nilOL }
531
532 rule    :: { LHsDecl RdrName }
533         : STRING activation rule_forall infixexp '=' exp
534              { LL $ RuleD (HsRule (getSTRING $1) $2 $3 $4 $6) }
535
536 activation :: { Activation }           -- Omitted means AlwaysActive
537         : {- empty -}                           { AlwaysActive }
538         | explicit_activation                   { $1 }
539
540 inverse_activation :: { Activation }   -- Omitted means NeverActive
541         : {- empty -}                           { NeverActive }
542         | explicit_activation                   { $1 }
543
544 explicit_activation :: { Activation }  -- In brackets
545         : '[' INTEGER ']'               { ActiveAfter  (fromInteger (getINTEGER $2)) }
546         | '[' '~' INTEGER ']'           { ActiveBefore (fromInteger (getINTEGER $3)) }
547
548 rule_forall :: { [RuleBndr RdrName] }
549         : 'forall' rule_var_list '.'            { $2 }
550         | {- empty -}                           { [] }
551
552 rule_var_list :: { [RuleBndr RdrName] }
553         : rule_var                              { [$1] }
554         | rule_var rule_var_list                { $1 : $2 }
555
556 rule_var :: { RuleBndr RdrName }
557         : varid                                 { RuleBndr $1 }
558         | '(' varid '::' ctype ')'              { RuleBndrSig $2 $4 }
559
560 -----------------------------------------------------------------------------
561 -- Deprecations (c.f. rules)
562
563 deprecations :: { OrdList (LHsDecl RdrName) }   -- Reversed
564         : deprecations ';' deprecation          { $1 `appOL` $3 }
565         | deprecations ';'                      { $1 }
566         | deprecation                           { $1 }
567         | {- empty -}                           { nilOL }
568
569 -- SUP: TEMPORARY HACK, not checking for `module Foo'
570 deprecation :: { OrdList (LHsDecl RdrName) }
571         : depreclist STRING
572                 { toOL [ LL $ DeprecD (Deprecation n (getSTRING $2)) 
573                        | n <- unLoc $1 ] }
574
575
576 -----------------------------------------------------------------------------
577 -- Foreign import and export declarations
578
579 -- for the time being, the following accepts foreign declarations conforming
580 -- to the FFI Addendum, Version 1.0 as well as pre-standard declarations
581 --
582 -- * a flag indicates whether pre-standard declarations have been used and
583 --   triggers a deprecation warning further down the road
584 --
585 -- NB: The first two rules could be combined into one by replacing `safety1'
586 --     with `safety'.  However, the combined rule conflicts with the
587 --     DEPRECATED rules.
588 --
589 fdecl :: { LHsDecl RdrName }
590 fdecl : 'import' callconv safety1 fspec
591                 {% mkImport $2 $3 (unLoc $4) >>= return.LL }
592       | 'import' callconv         fspec         
593                 {% do { d <- mkImport $2 (PlaySafe False) (unLoc $3);
594                         return (LL d) } }
595       | 'export' callconv fspec
596                 {% mkExport $2 (unLoc $3) >>= return.LL }
597         -- the following syntax is DEPRECATED
598       | fdecl1DEPRECATED                        { L1 (ForD (unLoc $1)) }
599       | fdecl2DEPRECATED                        { L1 (unLoc $1) }
600
601 fdecl1DEPRECATED :: { LForeignDecl RdrName }
602 fdecl1DEPRECATED 
603   ----------- DEPRECATED label decls ------------
604   : 'label' ext_name varid '::' sigtype
605     { LL $ ForeignImport $3 $5 (CImport defaultCCallConv (PlaySafe False) nilFS nilFS 
606                                    (CLabel ($2 `orElse` mkExtName (unLoc $3)))) True }
607
608   ----------- DEPRECATED ccall/stdcall decls ------------
609   --
610   -- NB: This business with the case expression below may seem overly
611   --     complicated, but it is necessary to avoid some conflicts.
612
613     -- DEPRECATED variant #1: lack of a calling convention specification
614     --                        (import) 
615   | 'import' {-no callconv-} ext_name safety varid_no_unsafe '::' sigtype
616     { let
617         target = StaticTarget ($2 `orElse` mkExtName (unLoc $4))
618       in
619       LL $ ForeignImport $4 $6 (CImport defaultCCallConv $3 nilFS nilFS 
620                                    (CFunction target)) True }
621
622     -- DEPRECATED variant #2: external name consists of two separate strings
623     --                        (module name and function name) (import)
624   | 'import' callconv STRING STRING safety varid_no_unsafe '::' sigtype
625     {% case $2 of
626          DNCall      -> parseError (comb2 $1 $>) "Illegal format of .NET foreign import"
627          CCall cconv -> return $
628            let
629              imp = CFunction (StaticTarget (getSTRING $4))
630            in
631            LL $ ForeignImport $6 $8 (CImport cconv $5 nilFS nilFS imp) True }
632
633     -- DEPRECATED variant #3: `unsafe' after entity
634   | 'import' callconv STRING 'unsafe' varid_no_unsafe '::' sigtype
635     {% case $2 of
636          DNCall      -> parseError (comb2 $1 $>) "Illegal format of .NET foreign import"
637          CCall cconv -> return $
638            let
639              imp = CFunction (StaticTarget (getSTRING $3))
640            in
641            LL $ ForeignImport $5 $7 (CImport cconv PlayRisky nilFS nilFS imp) True }
642
643     -- DEPRECATED variant #4: use of the special identifier `dynamic' without
644     --                        an explicit calling convention (import)
645   | 'import' {-no callconv-} 'dynamic' safety varid_no_unsafe '::' sigtype
646     { LL $ ForeignImport $4 $6 (CImport defaultCCallConv $3 nilFS nilFS 
647                                    (CFunction DynamicTarget)) True }
648
649     -- DEPRECATED variant #5: use of the special identifier `dynamic' (import)
650   | 'import' callconv 'dynamic' safety varid_no_unsafe '::' sigtype
651     {% case $2 of
652          DNCall      -> parseError (comb2 $1 $>) "Illegal format of .NET foreign import"
653          CCall cconv -> return $
654            LL $ ForeignImport $5 $7 (CImport cconv $4 nilFS nilFS 
655                                         (CFunction DynamicTarget)) True }
656
657     -- DEPRECATED variant #6: lack of a calling convention specification
658     --                        (export) 
659   | 'export' {-no callconv-} ext_name varid '::' sigtype
660     { LL $ ForeignExport $3 $5 (CExport (CExportStatic ($2 `orElse` mkExtName (unLoc $3))
661                                    defaultCCallConv)) True }
662
663     -- DEPRECATED variant #7: external name consists of two separate strings
664     --                        (module name and function name) (export)
665   | 'export' callconv STRING STRING varid '::' sigtype
666     {% case $2 of
667          DNCall      -> parseError (comb2 $1 $>) "Illegal format of .NET foreign import"
668          CCall cconv -> return $
669            LL $ ForeignExport $5 $7 
670                          (CExport (CExportStatic (getSTRING $4) cconv)) True }
671
672     -- DEPRECATED variant #8: use of the special identifier `dynamic' without
673     --                        an explicit calling convention (export)
674   | 'export' {-no callconv-} 'dynamic' varid '::' sigtype
675     { LL $ ForeignImport $3 $5 (CImport defaultCCallConv (PlaySafe False) nilFS nilFS 
676                                    CWrapper) True }
677
678     -- DEPRECATED variant #9: use of the special identifier `dynamic' (export)
679   | 'export' callconv 'dynamic' varid '::' sigtype
680     {% case $2 of
681          DNCall      -> parseError (comb2 $1 $>) "Illegal format of .NET foreign import"
682          CCall cconv -> return $
683            LL $ ForeignImport $4 $6 
684                  (CImport cconv (PlaySafe False) nilFS nilFS CWrapper) True }
685
686   ----------- DEPRECATED .NET decls ------------
687   -- NB: removed the .NET call declaration, as it is entirely subsumed
688   --     by the new standard FFI declarations
689
690 fdecl2DEPRECATED :: { LHsDecl RdrName }
691 fdecl2DEPRECATED 
692   : 'import' 'dotnet' 'type' ext_name tycon { LL $ TyClD (ForeignType $5 $4 DNType) }
693     -- left this one unchanged for the moment as type imports are not
694     -- covered currently by the FFI standard -=chak
695
696
697 callconv :: { CallConv }
698           : 'stdcall'                   { CCall  StdCallConv }
699           | 'ccall'                     { CCall  CCallConv   }
700           | 'dotnet'                    { DNCall             }
701
702 safety :: { Safety }
703         : 'unsafe'                      { PlayRisky }
704         | 'safe'                        { PlaySafe False }
705         | 'threadsafe'                  { PlaySafe True  }
706         | {- empty -}                   { PlaySafe False }
707
708 safety1 :: { Safety }
709         : 'unsafe'                      { PlayRisky }
710         | 'safe'                        { PlaySafe  False }
711         | 'threadsafe'                  { PlaySafe  True }
712           -- only needed to avoid conflicts with the DEPRECATED rules
713
714 fspec :: { Located (Located FastString, Located RdrName, LHsType RdrName) }
715        : STRING var '::' sigtype      { LL (L (getLoc $1) (getSTRING $1), $2, $4) }
716        |        var '::' sigtype      { LL (noLoc nilFS, $1, $3) }
717          -- if the entity string is missing, it defaults to the empty string;
718          -- the meaning of an empty entity string depends on the calling
719          -- convention
720
721 -- DEPRECATED syntax
722 ext_name :: { Maybe CLabelString }
723         : STRING                { Just (getSTRING $1) }
724         | STRING STRING         { Just (getSTRING $2) } -- Ignore "module name" for now
725         | {- empty -}           { Nothing }
726
727
728 -----------------------------------------------------------------------------
729 -- Type signatures
730
731 opt_sig :: { Maybe (LHsType RdrName) }
732         : {- empty -}                   { Nothing }
733         | '::' sigtype                  { Just $2 }
734
735 opt_asig :: { Maybe (LHsType RdrName) }
736         : {- empty -}                   { Nothing }
737         | '::' atype                    { Just $2 }
738
739 sigtypes1 :: { [LHsType RdrName] }
740         : sigtype                       { [ $1 ] }
741         | sigtype ',' sigtypes1         { $1 : $3 }
742
743 sigtype :: { LHsType RdrName }
744         : ctype                         { L1 (mkImplicitHsForAllTy (noLoc []) $1) }
745         -- Wrap an Implicit forall if there isn't one there already
746
747 sig_vars :: { Located [Located RdrName] }
748          : sig_vars ',' var             { LL ($3 : unLoc $1) }
749          | var                          { L1 [$1] }
750
751 -----------------------------------------------------------------------------
752 -- Types
753
754 strict_mark :: { Located HsBang }
755         : '!'                           { L1 HsStrict }
756         | '{-# UNPACK' '#-}' '!'        { LL HsUnbox }
757
758 -- A ctype is a for-all type
759 ctype   :: { LHsType RdrName }
760         : 'forall' tv_bndrs '.' ctype   { LL $ mkExplicitHsForAllTy $2 (noLoc []) $4 }
761         | context '=>' type             { LL $ mkImplicitHsForAllTy   $1 $3 }
762         -- A type of form (context => type) is an *implicit* HsForAllTy
763         | type                          { $1 }
764
765 -- We parse a context as a btype so that we don't get reduce/reduce
766 -- errors in ctype.  The basic problem is that
767 --      (Eq a, Ord a)
768 -- looks so much like a tuple type.  We can't tell until we find the =>
769 context :: { LHsContext RdrName }
770         : btype                         {% checkContext $1 }
771
772 type :: { LHsType RdrName }
773         : ipvar '::' gentype            { LL (HsPredTy (HsIParam (unLoc $1) $3)) }
774         | gentype                       { $1 }
775
776 gentype :: { LHsType RdrName }
777         : btype                         { $1 }
778         | btype qtyconop gentype        { LL $ HsOpTy $1 $2 $3 }
779         | btype tyvarop  gentype        { LL $ HsOpTy $1 $2 $3 }
780         | btype '->' gentype            { LL $ HsFunTy $1 $3 }
781
782 btype :: { LHsType RdrName }
783         : btype atype                   { LL $ HsAppTy $1 $2 }
784         | atype                         { $1 }
785
786 atype :: { LHsType RdrName }
787         : gtycon                        { L1 (HsTyVar (unLoc $1)) }
788         | tyvar                         { L1 (HsTyVar (unLoc $1)) }
789         | strict_mark atype             { LL (HsBangTy (unLoc $1) $2) }
790         | '(' type ',' comma_types1 ')' { LL $ HsTupleTy Boxed  ($2:$4) }
791         | '(#' comma_types1 '#)'        { LL $ HsTupleTy Unboxed $2     }
792         | '[' type ']'                  { LL $ HsListTy  $2 }
793         | '[:' type ':]'                { LL $ HsPArrTy  $2 }
794         | '(' ctype ')'                 { LL $ HsParTy   $2 }
795         | '(' ctype '::' kind ')'       { LL $ HsKindSig $2 $4 }
796 -- Generics
797         | INTEGER                       { L1 (HsNumTy (getINTEGER $1)) }
798
799 -- An inst_type is what occurs in the head of an instance decl
800 --      e.g.  (Foo a, Gaz b) => Wibble a b
801 -- It's kept as a single type, with a MonoDictTy at the right
802 -- hand corner, for convenience.
803 inst_type :: { LHsType RdrName }
804         : sigtype                       {% checkInstType $1 }
805
806 inst_types1 :: { [LHsType RdrName] }
807         : inst_type                     { [$1] }
808         | inst_type ',' inst_types1     { $1 : $3 }
809
810 comma_types0  :: { [LHsType RdrName] }
811         : comma_types1                  { $1 }
812         | {- empty -}                   { [] }
813
814 comma_types1    :: { [LHsType RdrName] }
815         : type                          { [$1] }
816         | type  ',' comma_types1        { $1 : $3 }
817
818 tv_bndrs :: { [LHsTyVarBndr RdrName] }
819          : tv_bndr tv_bndrs             { $1 : $2 }
820          | {- empty -}                  { [] }
821
822 tv_bndr :: { LHsTyVarBndr RdrName }
823         : tyvar                         { L1 (UserTyVar (unLoc $1)) }
824         | '(' tyvar '::' kind ')'       { LL (KindedTyVar (unLoc $2) $4) }
825
826 fds :: { Located [Located ([RdrName], [RdrName])] }
827         : {- empty -}                   { noLoc [] }
828         | '|' fds1                      { LL (reverse (unLoc $2)) }
829
830 fds1 :: { Located [Located ([RdrName], [RdrName])] }
831         : fds1 ',' fd                   { LL ($3 : unLoc $1) }
832         | fd                            { L1 [$1] }
833
834 fd :: { Located ([RdrName], [RdrName]) }
835         : varids0 '->' varids0          { L (comb3 $1 $2 $3)
836                                            (reverse (unLoc $1), reverse (unLoc $3)) }
837
838 varids0 :: { Located [RdrName] }
839         : {- empty -}                   { noLoc [] }
840         | varids0 tyvar                 { LL (unLoc $2 : unLoc $1) }
841
842 -----------------------------------------------------------------------------
843 -- Kinds
844
845 kind    :: { Kind }
846         : akind                 { $1 }
847         | akind '->' kind       { mkArrowKind $1 $3 }
848
849 akind   :: { Kind }
850         : '*'                   { liftedTypeKind }
851         | '(' kind ')'          { $2 }
852
853
854 -----------------------------------------------------------------------------
855 -- Datatype declarations
856
857 newconstr :: { LConDecl RdrName }
858         : conid atype   { LL $ ConDecl $1 Explicit [] (noLoc []) (PrefixCon [$2]) ResTyH98 }
859         | conid '{' var '::' ctype '}'
860                         { LL $ ConDecl $1 Explicit [] (noLoc []) (RecCon [($3, $5)]) ResTyH98 }
861
862 gadt_constrlist :: { Located [LConDecl RdrName] }
863         : '{'            gadt_constrs '}'       { LL (unLoc $2) }
864         |     vocurly    gadt_constrs close     { $2 }
865
866 gadt_constrs :: { Located [LConDecl RdrName] }
867         : gadt_constrs ';' gadt_constr  { LL ($3 : unLoc $1) }
868         | gadt_constrs ';'              { $1 }
869         | gadt_constr                   { L1 [$1] } 
870
871 -- We allow the following forms:
872 --      C :: Eq a => a -> T a
873 --      C :: forall a. Eq a => !a -> T a
874 --      D { x,y :: a } :: T a
875 --      forall a. Eq a => D { x,y :: a } :: T a
876
877 gadt_constr :: { LConDecl RdrName }
878         : con '::' sigtype
879               { LL (mkGadtDecl $1 $3) } 
880         -- Syntax: Maybe merge the record stuff with the single-case above?
881         --         (to kill the mostly harmless reduce/reduce error)
882         -- XXX revisit autrijus
883         | constr_stuff_record '::' sigtype
884                 { let (con,details) = unLoc $1 in 
885                   LL (ConDecl con Implicit [] (noLoc []) details (ResTyGADT $3)) }
886 {-
887         | forall context '=>' constr_stuff_record '::' sigtype
888                 { let (con,details) = unLoc $4 in 
889                   LL (ConDecl con Implicit (unLoc $1) $2 details (ResTyGADT $6)) }
890         | forall constr_stuff_record '::' sigtype
891                 { let (con,details) = unLoc $2 in 
892                   LL (ConDecl con Implicit (unLoc $1) (noLoc []) details (ResTyGADT $4)) }
893 -}
894
895
896 constrs :: { Located [LConDecl RdrName] }
897         : {- empty; a GHC extension -}  { noLoc [] }
898         | '=' constrs1                  { LL (unLoc $2) }
899
900 constrs1 :: { Located [LConDecl RdrName] }
901         : constrs1 '|' constr           { LL ($3 : unLoc $1) }
902         | constr                        { L1 [$1] }
903
904 constr :: { LConDecl RdrName }
905         : forall context '=>' constr_stuff      
906                 { let (con,details) = unLoc $4 in 
907                   LL (ConDecl con Explicit (unLoc $1) $2 details ResTyH98) }
908         | forall constr_stuff
909                 { let (con,details) = unLoc $2 in 
910                   LL (ConDecl con Explicit (unLoc $1) (noLoc []) details ResTyH98) }
911
912 forall :: { Located [LHsTyVarBndr RdrName] }
913         : 'forall' tv_bndrs '.'         { LL $2 }
914         | {- empty -}                   { noLoc [] }
915
916 constr_stuff :: { Located (Located RdrName, HsConDetails RdrName (LBangType RdrName)) }
917 -- We parse the constructor declaration 
918 --      C t1 t2
919 -- as a btype (treating C as a type constructor) and then convert C to be
920 -- a data constructor.  Reason: it might continue like this:
921 --      C t1 t2 %: D Int
922 -- in which case C really would be a type constructor.  We can't resolve this
923 -- ambiguity till we come across the constructor oprerator :% (or not, more usually)
924         : btype                         {% mkPrefixCon $1 [] >>= return.LL }
925         | oqtycon '{' '}'               {% mkRecCon $1 [] >>= return.LL }
926         | oqtycon '{' fielddecls '}'    {% mkRecCon $1 $3 >>= return.LL }
927         | btype conop btype             { LL ($2, InfixCon $1 $3) }
928
929 constr_stuff_record :: { Located (Located RdrName, HsConDetails RdrName (LBangType RdrName)) }
930         : oqtycon '{' '}'               {% mkRecCon $1 [] >>= return.sL (comb2 $1 $>) }
931         | oqtycon '{' fielddecls '}'    {% mkRecCon $1 $3 >>= return.sL (comb2 $1 $>) }
932
933 fielddecls :: { [([Located RdrName], LBangType RdrName)] }
934         : fielddecl ',' fielddecls      { unLoc $1 : $3 }
935         | fielddecl                     { [unLoc $1] }
936
937 fielddecl :: { Located ([Located RdrName], LBangType RdrName) }
938         : sig_vars '::' ctype           { LL (reverse (unLoc $1), $3) }
939
940 -- We allow the odd-looking 'inst_type' in a deriving clause, so that
941 -- we can do deriving( forall a. C [a] ) in a newtype (GHC extension).
942 -- The 'C [a]' part is converted to an HsPredTy by checkInstType
943 -- We don't allow a context, but that's sorted out by the type checker.
944 deriving :: { Located (Maybe [LHsType RdrName]) }
945         : {- empty -}                           { noLoc Nothing }
946         | 'deriving' qtycon     {% do { let { L loc tv = $2 }
947                                       ; p <- checkInstType (L loc (HsTyVar tv))
948                                       ; return (LL (Just [p])) } }
949         | 'deriving' '(' ')'                    { LL (Just []) }
950         | 'deriving' '(' inst_types1 ')'        { LL (Just $3) }
951              -- Glasgow extension: allow partial 
952              -- applications in derivings
953
954 -----------------------------------------------------------------------------
955 -- Value definitions
956
957 {- There's an awkward overlap with a type signature.  Consider
958         f :: Int -> Int = ...rhs...
959    Then we can't tell whether it's a type signature or a value
960    definition with a result signature until we see the '='.
961    So we have to inline enough to postpone reductions until we know.
962 -}
963
964 {-
965   ATTENTION: Dirty Hackery Ahead! If the second alternative of vars is var
966   instead of qvar, we get another shift/reduce-conflict. Consider the
967   following programs:
968   
969      { (^^) :: Int->Int ; }          Type signature; only var allowed
970
971      { (^^) :: Int->Int = ... ; }    Value defn with result signature;
972                                      qvar allowed (because of instance decls)
973   
974   We can't tell whether to reduce var to qvar until after we've read the signatures.
975 -}
976
977 decl    :: { Located (OrdList (LHsDecl RdrName)) }
978         : sigdecl                       { $1 }
979         | infixexp opt_sig rhs          {% do { r <- checkValDef $1 $2 $3;
980                                                 return (LL $ unitOL (LL $ ValD r)) } }
981
982 rhs     :: { Located (GRHSs RdrName) }
983         : '=' exp wherebinds    { L (comb3 $1 $2 $3) $ GRHSs (unguardedRHS $2) (unLoc $3) }
984         | gdrhs wherebinds      { LL $ GRHSs (reverse (unLoc $1)) (unLoc $2) }
985
986 gdrhs :: { Located [LGRHS RdrName] }
987         : gdrhs gdrh            { LL ($2 : unLoc $1) }
988         | gdrh                  { L1 [$1] }
989
990 gdrh :: { LGRHS RdrName }
991         : '|' quals '=' exp     { sL (comb2 $1 $>) $ GRHS (reverse (unLoc $2)) $4 }
992
993 sigdecl :: { Located (OrdList (LHsDecl RdrName)) }
994         : infixexp '::' sigtype
995                                 {% do s <- checkValSig $1 $3; 
996                                       return (LL $ unitOL (LL $ SigD s)) }
997                 -- See the above notes for why we need infixexp here
998         | var ',' sig_vars '::' sigtype 
999                                 { LL $ toOL [ LL $ SigD (Sig n $5) | n <- $1 : unLoc $3 ] }
1000         | infix prec ops        { LL $ toOL [ LL $ SigD (FixSig (FixitySig n (Fixity $2 (unLoc $1))))
1001                                              | n <- unLoc $3 ] }
1002         | '{-# INLINE'   activation qvar '#-}'        
1003                                 { LL $ unitOL (LL $ SigD (InlineSig True  $3 $2)) }
1004         | '{-# NOINLINE' inverse_activation qvar '#-}' 
1005                                 { LL $ unitOL (LL $ SigD (InlineSig False $3 $2)) }
1006         | '{-# SPECIALISE' qvar '::' sigtypes1 '#-}'
1007                                 { LL $ toOL [ LL $ SigD (SpecSig $2 t)
1008                                             | t <- $4] }
1009         | '{-# SPECIALISE' 'instance' inst_type '#-}'
1010                                 { LL $ unitOL (LL $ SigD (SpecInstSig $3)) }
1011
1012 -----------------------------------------------------------------------------
1013 -- Expressions
1014
1015 exp   :: { LHsExpr RdrName }
1016         : infixexp '::' sigtype         { LL $ ExprWithTySig $1 $3 }
1017         | infixexp '-<' exp             { LL $ HsArrApp $1 $3 placeHolderType HsFirstOrderApp True }
1018         | infixexp '>-' exp             { LL $ HsArrApp $3 $1 placeHolderType HsFirstOrderApp False }
1019         | infixexp '-<<' exp            { LL $ HsArrApp $1 $3 placeHolderType HsHigherOrderApp True }
1020         | infixexp '>>-' exp            { LL $ HsArrApp $3 $1 placeHolderType HsHigherOrderApp False}
1021         | infixexp                      { $1 }
1022
1023 infixexp :: { LHsExpr RdrName }
1024         : exp10                         { $1 }
1025         | infixexp qop exp10            { LL (OpApp $1 $2 (panic "fixity") $3) }
1026
1027 exp10 :: { LHsExpr RdrName }
1028         : '\\' aexp aexps opt_asig '->' exp     
1029                         {% checkPatterns ($2 : reverse $3) >>= \ ps -> 
1030                            return (LL $ HsLam (mkMatchGroup [LL $ Match ps $4
1031                                             (GRHSs (unguardedRHS $6) emptyLocalBinds
1032                                                         )])) }
1033         | 'let' binds 'in' exp                  { LL $ HsLet (unLoc $2) $4 }
1034         | 'if' exp 'then' exp 'else' exp        { LL $ HsIf $2 $4 $6 }
1035         | 'case' exp 'of' altslist              { LL $ HsCase $2 (mkMatchGroup (unLoc $4)) }
1036         | '-' fexp                              { LL $ mkHsNegApp $2 }
1037
1038         | 'do' stmtlist                 {% let loc = comb2 $1 $2 in
1039                                            checkDo loc (unLoc $2)  >>= \ (stmts,body) ->
1040                                            return (L loc (mkHsDo DoExpr stmts body)) }
1041         | 'mdo' stmtlist                {% let loc = comb2 $1 $2 in
1042                                            checkDo loc (unLoc $2)  >>= \ (stmts,body) ->
1043                                            return (L loc (mkHsDo (MDoExpr noPostTcTable) stmts body)) }
1044         | scc_annot exp                         { LL $ if opt_SccProfilingOn
1045                                                         then HsSCC (unLoc $1) $2
1046                                                         else HsPar $2 }
1047
1048         | 'proc' aexp '->' exp  
1049                         {% checkPattern $2 >>= \ p -> 
1050                            return (LL $ HsProc p (LL $ HsCmdTop $4 [] 
1051                                                    placeHolderType undefined)) }
1052                                                 -- TODO: is LL right here?
1053
1054         | '{-# CORE' STRING '#-}' exp           { LL $ HsCoreAnn (getSTRING $2) $4 }
1055                                                     -- hdaume: core annotation
1056         | fexp                                  { $1 }
1057
1058 scc_annot :: { Located FastString }
1059         : '_scc_' STRING                        { LL $ getSTRING $2 }
1060         | '{-# SCC' STRING '#-}'                { LL $ getSTRING $2 }
1061
1062 fexp    :: { LHsExpr RdrName }
1063         : fexp aexp                             { LL $ HsApp $1 $2 }
1064         | aexp                                  { $1 }
1065
1066 aexps   :: { [LHsExpr RdrName] }
1067         : aexps aexp                            { $2 : $1 }
1068         | {- empty -}                           { [] }
1069
1070 aexp    :: { LHsExpr RdrName }
1071         : qvar '@' aexp                 { LL $ EAsPat $1 $3 }
1072         | '~' aexp                      { LL $ ELazyPat $2 }
1073         | aexp1                         { $1 }
1074
1075 aexp1   :: { LHsExpr RdrName }
1076         : aexp1 '{' fbinds '}'  {% do { r <- mkRecConstrOrUpdate $1 (comb2 $2 $4) 
1077                                                         (reverse $3);
1078                                         return (LL r) }}
1079         | aexp2                 { $1 }
1080
1081 -- Here was the syntax for type applications that I was planning
1082 -- but there are difficulties (e.g. what order for type args)
1083 -- so it's not enabled yet.
1084 -- But this case *is* used for the left hand side of a generic definition,
1085 -- which is parsed as an expression before being munged into a pattern
1086         | qcname '{|' gentype '|}'      { LL $ HsApp (sL (getLoc $1) (HsVar (unLoc $1)))
1087                                                      (sL (getLoc $3) (HsType $3)) }
1088
1089 aexp2   :: { LHsExpr RdrName }
1090         : ipvar                         { L1 (HsIPVar $! unLoc $1) }
1091         | qcname                        { L1 (HsVar   $! unLoc $1) }
1092         | literal                       { L1 (HsLit   $! unLoc $1) }
1093         | INTEGER                       { L1 (HsOverLit $! mkHsIntegral (getINTEGER $1)) }
1094         | RATIONAL                      { L1 (HsOverLit $! mkHsFractional (getRATIONAL $1)) }
1095         | '(' exp ')'                   { LL (HsPar $2) }
1096         | '(' exp ',' texps ')'         { LL $ ExplicitTuple ($2 : reverse $4) Boxed }
1097         | '(#' texps '#)'               { LL $ ExplicitTuple (reverse $2)      Unboxed }
1098         | '[' list ']'                  { LL (unLoc $2) }
1099         | '[:' parr ':]'                { LL (unLoc $2) }
1100         | '(' infixexp qop ')'          { LL $ SectionL $2 $3 }
1101         | '(' qopm infixexp ')'         { LL $ SectionR $2 $3 }
1102         | '_'                           { L1 EWildPat }
1103         
1104         -- MetaHaskell Extension
1105         | TH_ID_SPLICE          { L1 $ HsSpliceE (mkHsSplice 
1106                                         (L1 $ HsVar (mkUnqual varName 
1107                                                         (getTH_ID_SPLICE $1)))) } -- $x
1108         | '$(' exp ')'          { LL $ HsSpliceE (mkHsSplice $2) }               -- $( exp )
1109
1110         | TH_VAR_QUOTE qvar     { LL $ HsBracket (VarBr (unLoc $2)) }
1111         | TH_VAR_QUOTE qcon     { LL $ HsBracket (VarBr (unLoc $2)) }
1112         | TH_TY_QUOTE tyvar     { LL $ HsBracket (VarBr (unLoc $2)) }
1113         | TH_TY_QUOTE gtycon    { LL $ HsBracket (VarBr (unLoc $2)) }
1114         | '[|' exp '|]'         { LL $ HsBracket (ExpBr $2) }                       
1115         | '[t|' ctype '|]'      { LL $ HsBracket (TypBr $2) }                       
1116         | '[p|' infixexp '|]'   {% checkPattern $2 >>= \p ->
1117                                            return (LL $ HsBracket (PatBr p)) }
1118         | '[d|' cvtopbody '|]'  { LL $ HsBracket (DecBr (mkGroup $2)) }
1119
1120         -- arrow notation extension
1121         | '(|' aexp2 cmdargs '|)'       { LL $ HsArrForm $2 Nothing (reverse $3) }
1122
1123 cmdargs :: { [LHsCmdTop RdrName] }
1124         : cmdargs acmd                  { $2 : $1 }
1125         | {- empty -}                   { [] }
1126
1127 acmd    :: { LHsCmdTop RdrName }
1128         : aexp2                 { L1 $ HsCmdTop $1 [] placeHolderType undefined }
1129
1130 cvtopbody :: { [LHsDecl RdrName] }
1131         :  '{'            cvtopdecls0 '}'               { $2 }
1132         |      vocurly    cvtopdecls0 close             { $2 }
1133
1134 cvtopdecls0 :: { [LHsDecl RdrName] }
1135         : {- empty -}           { [] }
1136         | cvtopdecls            { $1 }
1137
1138 texps :: { [LHsExpr RdrName] }
1139         : texps ',' exp                 { $3 : $1 }
1140         | exp                           { [$1] }
1141
1142
1143 -----------------------------------------------------------------------------
1144 -- List expressions
1145
1146 -- The rules below are little bit contorted to keep lexps left-recursive while
1147 -- avoiding another shift/reduce-conflict.
1148
1149 list :: { LHsExpr RdrName }
1150         : exp                   { L1 $ ExplicitList placeHolderType [$1] }
1151         | lexps                 { L1 $ ExplicitList placeHolderType (reverse (unLoc $1)) }
1152         | exp '..'              { LL $ ArithSeq noPostTcExpr (From $1) }
1153         | exp ',' exp '..'      { LL $ ArithSeq noPostTcExpr (FromThen $1 $3) }
1154         | exp '..' exp          { LL $ ArithSeq noPostTcExpr (FromTo $1 $3) }
1155         | exp ',' exp '..' exp  { LL $ ArithSeq noPostTcExpr (FromThenTo $1 $3 $5) }
1156         | exp pquals            { sL (comb2 $1 $>) $ mkHsDo ListComp (reverse (unLoc $2)) $1 }
1157
1158 lexps :: { Located [LHsExpr RdrName] }
1159         : lexps ',' exp                 { LL ($3 : unLoc $1) }
1160         | exp ',' exp                   { LL [$3,$1] }
1161
1162 -----------------------------------------------------------------------------
1163 -- List Comprehensions
1164
1165 pquals :: { Located [LStmt RdrName] }   -- Either a singleton ParStmt, 
1166                                         -- or a reversed list of Stmts
1167         : pquals1                       { case unLoc $1 of
1168                                             [qs] -> L1 qs
1169                                             qss  -> L1 [L1 (ParStmt stmtss)]
1170                                                  where
1171                                                     stmtss = [ (reverse qs, undefined) 
1172                                                              | qs <- qss ]
1173                                         }
1174                         
1175 pquals1 :: { Located [[LStmt RdrName]] }
1176         : pquals1 '|' quals             { LL (unLoc $3 : unLoc $1) }
1177         | '|' quals                     { L (getLoc $2) [unLoc $2] }
1178
1179 quals :: { Located [LStmt RdrName] }
1180         : quals ',' qual                { LL ($3 : unLoc $1) }
1181         | qual                          { L1 [$1] }
1182
1183 -----------------------------------------------------------------------------
1184 -- Parallel array expressions
1185
1186 -- The rules below are little bit contorted; see the list case for details.
1187 -- Note that, in contrast to lists, we only have finite arithmetic sequences.
1188 -- Moreover, we allow explicit arrays with no element (represented by the nil
1189 -- constructor in the list case).
1190
1191 parr :: { LHsExpr RdrName }
1192         :                               { noLoc (ExplicitPArr placeHolderType []) }
1193         | exp                           { L1 $ ExplicitPArr placeHolderType [$1] }
1194         | lexps                         { L1 $ ExplicitPArr placeHolderType 
1195                                                        (reverse (unLoc $1)) }
1196         | exp '..' exp                  { LL $ PArrSeq noPostTcExpr (FromTo $1 $3) }
1197         | exp ',' exp '..' exp          { LL $ PArrSeq noPostTcExpr (FromThenTo $1 $3 $5) }
1198         | exp pquals                    { sL (comb2 $1 $>) $ mkHsDo PArrComp (reverse (unLoc $2)) $1 }
1199
1200 -- We are reusing `lexps' and `pquals' from the list case.
1201
1202 -----------------------------------------------------------------------------
1203 -- Case alternatives
1204
1205 altslist :: { Located [LMatch RdrName] }
1206         : '{'            alts '}'       { LL (reverse (unLoc $2)) }
1207         |     vocurly    alts  close    { L (getLoc $2) (reverse (unLoc $2)) }
1208
1209 alts    :: { Located [LMatch RdrName] }
1210         : alts1                         { L1 (unLoc $1) }
1211         | ';' alts                      { LL (unLoc $2) }
1212
1213 alts1   :: { Located [LMatch RdrName] }
1214         : alts1 ';' alt                 { LL ($3 : unLoc $1) }
1215         | alts1 ';'                     { LL (unLoc $1) }
1216         | alt                           { L1 [$1] }
1217
1218 alt     :: { LMatch RdrName }
1219         : infixexp opt_sig alt_rhs      {%  checkPattern $1 >>= \p ->
1220                                             return (LL (Match [p] $2 (unLoc $3))) }
1221
1222 alt_rhs :: { Located (GRHSs RdrName) }
1223         : ralt wherebinds               { LL (GRHSs (unLoc $1) (unLoc $2)) }
1224
1225 ralt :: { Located [LGRHS RdrName] }
1226         : '->' exp                      { LL (unguardedRHS $2) }
1227         | gdpats                        { L1 (reverse (unLoc $1)) }
1228
1229 gdpats :: { Located [LGRHS RdrName] }
1230         : gdpats gdpat                  { LL ($2 : unLoc $1) }
1231         | gdpat                         { L1 [$1] }
1232
1233 gdpat   :: { LGRHS RdrName }
1234         : '|' quals '->' exp            { sL (comb2 $1 $>) $ GRHS (reverse (unLoc $2)) $4 }
1235
1236 -----------------------------------------------------------------------------
1237 -- Statement sequences
1238
1239 stmtlist :: { Located [LStmt RdrName] }
1240         : '{'           stmts '}'       { LL (unLoc $2) }
1241         |     vocurly   stmts close     { $2 }
1242
1243 --      do { ;; s ; s ; ; s ;; }
1244 -- The last Stmt should be an expression, but that's hard to enforce
1245 -- here, because we need too much lookahead if we see do { e ; }
1246 -- So we use ExprStmts throughout, and switch the last one over
1247 -- in ParseUtils.checkDo instead
1248 stmts :: { Located [LStmt RdrName] }
1249         : stmt stmts_help               { LL ($1 : unLoc $2) }
1250         | ';' stmts                     { LL (unLoc $2) }
1251         | {- empty -}                   { noLoc [] }
1252
1253 stmts_help :: { Located [LStmt RdrName] } -- might be empty
1254         : ';' stmts                     { LL (unLoc $2) }
1255         | {- empty -}                   { noLoc [] }
1256
1257 -- For typing stmts at the GHCi prompt, where 
1258 -- the input may consist of just comments.
1259 maybe_stmt :: { Maybe (LStmt RdrName) }
1260         : stmt                          { Just $1 }
1261         | {- nothing -}                 { Nothing }
1262
1263 stmt  :: { LStmt RdrName }
1264         : qual                          { $1 }
1265         | infixexp '->' exp             {% checkPattern $3 >>= \p ->
1266                                            return (LL $ mkBindStmt p $1) }
1267         | 'rec' stmtlist                { LL $ mkRecStmt (unLoc $2) }
1268
1269 qual  :: { LStmt RdrName }
1270         : infixexp '<-' exp             {% checkPattern $1 >>= \p ->
1271                                            return (LL $ mkBindStmt p $3) }
1272         | exp                           { L1 $ mkExprStmt $1 }
1273         | 'let' binds                   { LL $ LetStmt (unLoc $2) }
1274
1275 -----------------------------------------------------------------------------
1276 -- Record Field Update/Construction
1277
1278 fbinds  :: { HsRecordBinds RdrName }
1279         : fbinds1                       { $1 }
1280         | {- empty -}                   { [] }
1281
1282 fbinds1 :: { HsRecordBinds RdrName }
1283         : fbinds1 ',' fbind             { $3 : $1 }
1284         | fbind                         { [$1] }
1285   
1286 fbind   :: { (Located RdrName, LHsExpr RdrName) }
1287         : qvar '=' exp                  { ($1,$3) }
1288
1289 -----------------------------------------------------------------------------
1290 -- Implicit Parameter Bindings
1291
1292 dbinds  :: { Located [LIPBind RdrName] }
1293         : dbinds ';' dbind              { LL ($3 : unLoc $1) }
1294         | dbinds ';'                    { LL (unLoc $1) }
1295         | dbind                         { L1 [$1] }
1296 --      | {- empty -}                   { [] }
1297
1298 dbind   :: { LIPBind RdrName }
1299 dbind   : ipvar '=' exp                 { LL (IPBind (unLoc $1) $3) }
1300
1301 ipvar   :: { Located (IPName RdrName) }
1302         : IPDUPVARID            { L1 (Dupable (mkUnqual varName (getIPDUPVARID $1))) }
1303         | IPSPLITVARID          { L1 (Linear  (mkUnqual varName (getIPSPLITVARID $1))) }
1304
1305 -----------------------------------------------------------------------------
1306 -- Deprecations
1307
1308 depreclist :: { Located [RdrName] }
1309 depreclist : deprec_var                 { L1 [unLoc $1] }
1310            | deprec_var ',' depreclist  { LL (unLoc $1 : unLoc $3) }
1311
1312 deprec_var :: { Located RdrName }
1313 deprec_var : var                        { $1 }
1314            | con                        { $1 }
1315
1316 -----------------------------------------
1317 -- Data constructors
1318 qcon    :: { Located RdrName }
1319         : qconid                { $1 }
1320         | '(' qconsym ')'       { LL (unLoc $2) }
1321         | sysdcon               { L1 $ nameRdrName (dataConName (unLoc $1)) }
1322 -- The case of '[:' ':]' is part of the production `parr'
1323
1324 con     :: { Located RdrName }
1325         : conid                 { $1 }
1326         | '(' consym ')'        { LL (unLoc $2) }
1327         | sysdcon               { L1 $ nameRdrName (dataConName (unLoc $1)) }
1328
1329 sysdcon :: { Located DataCon }  -- Wired in data constructors
1330         : '(' ')'               { LL unitDataCon }
1331         | '(' commas ')'        { LL $ tupleCon Boxed $2 }
1332         | '[' ']'               { LL nilDataCon }
1333
1334 conop :: { Located RdrName }
1335         : consym                { $1 }  
1336         | '`' conid '`'         { LL (unLoc $2) }
1337
1338 qconop :: { Located RdrName }
1339         : qconsym               { $1 }
1340         | '`' qconid '`'        { LL (unLoc $2) }
1341
1342 -----------------------------------------------------------------------------
1343 -- Type constructors
1344
1345 gtycon  :: { Located RdrName }  -- A "general" qualified tycon
1346         : oqtycon                       { $1 }
1347         | '(' ')'                       { LL $ getRdrName unitTyCon }
1348         | '(' commas ')'                { LL $ getRdrName (tupleTyCon Boxed $2) }
1349         | '(' '->' ')'                  { LL $ getRdrName funTyCon }
1350         | '[' ']'                       { LL $ listTyCon_RDR }
1351         | '[:' ':]'                     { LL $ parrTyCon_RDR }
1352
1353 oqtycon :: { Located RdrName }  -- An "ordinary" qualified tycon
1354         : qtycon                        { $1 }
1355         | '(' qtyconsym ')'             { LL (unLoc $2) }
1356
1357 qtyconop :: { Located RdrName } -- Qualified or unqualified
1358         : qtyconsym                     { $1 }
1359         | '`' qtycon '`'                { LL (unLoc $2) }
1360
1361 qtycon :: { Located RdrName }   -- Qualified or unqualified
1362         : QCONID                        { L1 $! mkQual tcClsName (getQCONID $1) }
1363         | tycon                         { $1 }
1364
1365 tycon   :: { Located RdrName }  -- Unqualified
1366         : CONID                         { L1 $! mkUnqual tcClsName (getCONID $1) }
1367
1368 qtyconsym :: { Located RdrName }
1369         : QCONSYM                       { L1 $! mkQual tcClsName (getQCONSYM $1) }
1370         | tyconsym                      { $1 }
1371
1372 tyconsym :: { Located RdrName }
1373         : CONSYM                        { L1 $! mkUnqual tcClsName (getCONSYM $1) }
1374
1375 -----------------------------------------------------------------------------
1376 -- Operators
1377
1378 op      :: { Located RdrName }   -- used in infix decls
1379         : varop                 { $1 }
1380         | conop                 { $1 }
1381
1382 varop   :: { Located RdrName }
1383         : varsym                { $1 }
1384         | '`' varid '`'         { LL (unLoc $2) }
1385
1386 qop     :: { LHsExpr RdrName }   -- used in sections
1387         : qvarop                { L1 $ HsVar (unLoc $1) }
1388         | qconop                { L1 $ HsVar (unLoc $1) }
1389
1390 qopm    :: { LHsExpr RdrName }   -- used in sections
1391         : qvaropm               { L1 $ HsVar (unLoc $1) }
1392         | qconop                { L1 $ HsVar (unLoc $1) }
1393
1394 qvarop :: { Located RdrName }
1395         : qvarsym               { $1 }
1396         | '`' qvarid '`'        { LL (unLoc $2) }
1397
1398 qvaropm :: { Located RdrName }
1399         : qvarsym_no_minus      { $1 }
1400         | '`' qvarid '`'        { LL (unLoc $2) }
1401
1402 -----------------------------------------------------------------------------
1403 -- Type variables
1404
1405 tyvar   :: { Located RdrName }
1406 tyvar   : tyvarid               { $1 }
1407         | '(' tyvarsym ')'      { LL (unLoc $2) }
1408
1409 tyvarop :: { Located RdrName }
1410 tyvarop : '`' tyvarid '`'       { LL (unLoc $2) }
1411         | tyvarsym              { $1 }
1412
1413 tyvarid :: { Located RdrName }
1414         : VARID                 { L1 $! mkUnqual tvName (getVARID $1) }
1415         | special_id            { L1 $! mkUnqual tvName (unLoc $1) }
1416         | 'unsafe'              { L1 $! mkUnqual tvName FSLIT("unsafe") }
1417         | 'safe'                { L1 $! mkUnqual tvName FSLIT("safe") }
1418         | 'threadsafe'          { L1 $! mkUnqual tvName FSLIT("threadsafe") }
1419
1420 tyvarsym :: { Located RdrName }
1421 -- Does not include "!", because that is used for strictness marks
1422 --               or ".", because that separates the quantified type vars from the rest
1423 --               or "*", because that's used for kinds
1424 tyvarsym : VARSYM               { L1 $! mkUnqual tvName (getVARSYM $1) }
1425
1426 -----------------------------------------------------------------------------
1427 -- Variables 
1428
1429 var     :: { Located RdrName }
1430         : varid                 { $1 }
1431         | '(' varsym ')'        { LL (unLoc $2) }
1432
1433 qvar    :: { Located RdrName }
1434         : qvarid                { $1 }
1435         | '(' varsym ')'        { LL (unLoc $2) }
1436         | '(' qvarsym1 ')'      { LL (unLoc $2) }
1437 -- We've inlined qvarsym here so that the decision about
1438 -- whether it's a qvar or a var can be postponed until
1439 -- *after* we see the close paren.
1440
1441 qvarid :: { Located RdrName }
1442         : varid                 { $1 }
1443         | QVARID                { L1 $ mkQual varName (getQVARID $1) }
1444
1445 varid :: { Located RdrName }
1446         : varid_no_unsafe       { $1 }
1447         | 'unsafe'              { L1 $! mkUnqual varName FSLIT("unsafe") }
1448         | 'safe'                { L1 $! mkUnqual varName FSLIT("safe") }
1449         | 'threadsafe'          { L1 $! mkUnqual varName FSLIT("threadsafe") }
1450
1451 varid_no_unsafe :: { Located RdrName }
1452         : VARID                 { L1 $! mkUnqual varName (getVARID $1) }
1453         | special_id            { L1 $! mkUnqual varName (unLoc $1) }
1454         | 'forall'              { L1 $! mkUnqual varName FSLIT("forall") }
1455
1456 qvarsym :: { Located RdrName }
1457         : varsym                { $1 }
1458         | qvarsym1              { $1 }
1459
1460 qvarsym_no_minus :: { Located RdrName }
1461         : varsym_no_minus       { $1 }
1462         | qvarsym1              { $1 }
1463
1464 qvarsym1 :: { Located RdrName }
1465 qvarsym1 : QVARSYM              { L1 $ mkQual varName (getQVARSYM $1) }
1466
1467 varsym :: { Located RdrName }
1468         : varsym_no_minus       { $1 }
1469         | '-'                   { L1 $ mkUnqual varName FSLIT("-") }
1470
1471 varsym_no_minus :: { Located RdrName } -- varsym not including '-'
1472         : VARSYM                { L1 $ mkUnqual varName (getVARSYM $1) }
1473         | special_sym           { L1 $ mkUnqual varName (unLoc $1) }
1474
1475
1476 -- These special_ids are treated as keywords in various places, 
1477 -- but as ordinary ids elsewhere.   'special_id' collects all these
1478 -- except 'unsafe' and 'forall' whose treatment differs depending on context
1479 special_id :: { Located UserFS }
1480 special_id
1481         : 'as'                  { L1 FSLIT("as") }
1482         | 'qualified'           { L1 FSLIT("qualified") }
1483         | 'hiding'              { L1 FSLIT("hiding") }
1484         | 'export'              { L1 FSLIT("export") }
1485         | 'label'               { L1 FSLIT("label")  }
1486         | 'dynamic'             { L1 FSLIT("dynamic") }
1487         | 'stdcall'             { L1 FSLIT("stdcall") }
1488         | 'ccall'               { L1 FSLIT("ccall") }
1489
1490 special_sym :: { Located UserFS }
1491 special_sym : '!'       { L1 FSLIT("!") }
1492             | '.'       { L1 FSLIT(".") }
1493             | '*'       { L1 FSLIT("*") }
1494
1495 -----------------------------------------------------------------------------
1496 -- Data constructors
1497
1498 qconid :: { Located RdrName }   -- Qualified or unqualified
1499         : conid                 { $1 }
1500         | QCONID                { L1 $ mkQual dataName (getQCONID $1) }
1501
1502 conid   :: { Located RdrName }
1503         : CONID                 { L1 $ mkUnqual dataName (getCONID $1) }
1504
1505 qconsym :: { Located RdrName }  -- Qualified or unqualified
1506         : consym                { $1 }
1507         | QCONSYM               { L1 $ mkQual dataName (getQCONSYM $1) }
1508
1509 consym :: { Located RdrName }
1510         : CONSYM                { L1 $ mkUnqual dataName (getCONSYM $1) }
1511
1512         -- ':' means only list cons
1513         | ':'                   { L1 $ consDataCon_RDR }
1514
1515
1516 -----------------------------------------------------------------------------
1517 -- Literals
1518
1519 literal :: { Located HsLit }
1520         : CHAR                  { L1 $ HsChar       $ getCHAR $1 }
1521         | STRING                { L1 $ HsString     $ getSTRING $1 }
1522         | PRIMINTEGER           { L1 $ HsIntPrim    $ getPRIMINTEGER $1 }
1523         | PRIMCHAR              { L1 $ HsCharPrim   $ getPRIMCHAR $1 }
1524         | PRIMSTRING            { L1 $ HsStringPrim $ getPRIMSTRING $1 }
1525         | PRIMFLOAT             { L1 $ HsFloatPrim  $ getPRIMFLOAT $1 }
1526         | PRIMDOUBLE            { L1 $ HsDoublePrim $ getPRIMDOUBLE $1 }
1527
1528 -----------------------------------------------------------------------------
1529 -- Layout
1530
1531 close :: { () }
1532         : vccurly               { () } -- context popped in lexer.
1533         | error                 {% popContext }
1534
1535 -----------------------------------------------------------------------------
1536 -- Miscellaneous (mostly renamings)
1537
1538 modid   :: { Located Module }
1539         : CONID                 { L1 $ mkModuleFS (getCONID $1) }
1540         | QCONID                { L1 $ let (mod,c) = getQCONID $1 in
1541                                   mkModuleFS
1542                                    (mkFastString
1543                                      (unpackFS mod ++ '.':unpackFS c))
1544                                 }
1545
1546 commas :: { Int }
1547         : commas ','                    { $1 + 1 }
1548         | ','                           { 2 }
1549
1550 -----------------------------------------------------------------------------
1551
1552 {
1553 happyError :: P a
1554 happyError = srcParseFail
1555
1556 getVARID        (L _ (ITvarid    x)) = x
1557 getCONID        (L _ (ITconid    x)) = x
1558 getVARSYM       (L _ (ITvarsym   x)) = x
1559 getCONSYM       (L _ (ITconsym   x)) = x
1560 getQVARID       (L _ (ITqvarid   x)) = x
1561 getQCONID       (L _ (ITqconid   x)) = x
1562 getQVARSYM      (L _ (ITqvarsym  x)) = x
1563 getQCONSYM      (L _ (ITqconsym  x)) = x
1564 getIPDUPVARID   (L _ (ITdupipvarid   x)) = x
1565 getIPSPLITVARID (L _ (ITsplitipvarid x)) = x
1566 getCHAR         (L _ (ITchar     x)) = x
1567 getSTRING       (L _ (ITstring   x)) = x
1568 getINTEGER      (L _ (ITinteger  x)) = x
1569 getRATIONAL     (L _ (ITrational x)) = x
1570 getPRIMCHAR     (L _ (ITprimchar   x)) = x
1571 getPRIMSTRING   (L _ (ITprimstring x)) = x
1572 getPRIMINTEGER  (L _ (ITprimint    x)) = x
1573 getPRIMFLOAT    (L _ (ITprimfloat  x)) = x
1574 getPRIMDOUBLE   (L _ (ITprimdouble x)) = x
1575 getTH_ID_SPLICE (L _ (ITidEscape x)) = x
1576
1577 -- Utilities for combining source spans
1578 comb2 :: Located a -> Located b -> SrcSpan
1579 comb2 = combineLocs
1580
1581 comb3 :: Located a -> Located b -> Located c -> SrcSpan
1582 comb3 a b c = combineSrcSpans (getLoc a) (combineSrcSpans (getLoc b) (getLoc c))
1583
1584 comb4 :: Located a -> Located b -> Located c -> Located d -> SrcSpan
1585 comb4 a b c d = combineSrcSpans (getLoc a) $ combineSrcSpans (getLoc b) $
1586                 combineSrcSpans (getLoc c) (getLoc d)
1587
1588 -- strict constructor version:
1589 {-# INLINE sL #-}
1590 sL :: SrcSpan -> a -> Located a
1591 sL span a = span `seq` L span a
1592
1593 -- Make a source location for the file.  We're a bit lazy here and just
1594 -- make a point SrcSpan at line 1, column 0.  Strictly speaking we should
1595 -- try to find the span of the whole file (ToDo).
1596 fileSrcSpan :: P SrcSpan
1597 fileSrcSpan = do 
1598   l <- getSrcLoc; 
1599   let loc = mkSrcLoc (srcLocFile l) 1 0;
1600   return (mkSrcSpan loc loc)
1601 }