1 {- Notes about the syntax of interface files
2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 interface "edison" M 4 6 2 ! 406 Module M, version 4, from package 'edison',
6 Fixities version 6, rules version 2
7 Interface syntax version 406
8 ! means M contains orphans
12 import Foo ; To compile M I used nothing from Foo, but it's
13 below me in the hierarchy
15 import Foo ! @ ; Ditto, but the ! means that Foo contains orphans
16 and the @ means that Foo is a boot interface
18 import Foo :: 3 ; To compile M I used everything from Foo, which has
21 import Foo :: 3 2 6 a 1 b 3 c 7 ; To compile M I used Foo. It had
25 and some specific things besides.
31 module ParseIface ( parseIface, parseType, parseRules, parseIdInfo ) where
33 #include "HsVersions.h"
35 import HsSyn -- quite a bit of stuff
36 import RdrHsSyn -- oodles of synonyms
37 import HsTypes ( mkHsForAllTy, mkHsTupCon )
39 import Demand ( mkStrictnessInfo )
40 import Literal ( Literal(..), mkMachInt, mkMachInt64, mkMachWord, mkMachWord64 )
41 import BasicTypes ( Fixity(..), FixityDirection(..),
42 NewOrData(..), Version, initialVersion, Boxity(..)
44 import CostCentre ( CostCentre(..), IsCafCC(..), IsDupdCC(..) )
45 import CallConv ( cCallConv )
46 import Type ( Kind, mkArrowKind, liftedTypeKind, openTypeKind, usageTypeKind )
47 import IdInfo ( InlinePragInfo(..) )
48 import PrimOp ( CCall(..), CCallTarget(..) )
51 import RnMonad ( ParsedIface(..), ExportItem, IfaceDeprecs )
52 import HscTypes ( WhetherHasOrphans, IsBootInterface, GenAvailInfo(..),
53 ImportVersion, WhatsImported(..),
56 import RdrName ( RdrName, mkRdrUnqual, mkIfaceOrig )
57 import Name ( OccName )
58 import OccName ( mkSysOccFS,
59 tcName, varName, dataName, clsName, tvName,
62 import Module ( ModuleName, PackageName, mkSysModuleNameFS, mkModule )
63 import SrcLoc ( SrcLoc )
64 import CmdLineOpts ( opt_InPackage, opt_IgnoreIfacePragmas )
66 import Class ( DefMeth (..) )
69 import FastString ( tailFS )
72 %name parseIface iface
74 %name parseIdInfo id_info
75 %name parseRules rules_and_deprecs
78 %monad { P }{ thenP }{ returnP }
79 %lexer { lexer } { ITeof }
83 'case' { ITcase } -- Haskell keywords
86 'default' { ITdefault }
87 'deriving' { ITderiving }
97 'instance' { ITinstance }
100 'newtype' { ITnewtype }
102 'qualified' { ITqualified }
107 'forall' { ITforall } -- GHC extension keywords
108 'foreign' { ITforeign }
109 'export' { ITexport }
111 'dynamic' { ITdynamic }
112 'unsafe' { ITunsafe }
114 'stdcall' { ITstdcallconv }
115 'ccall' { ITccallconv }
117 '__interface' { ITinterface } -- interface keywords
118 '__export' { IT__export }
119 '__depends' { ITdepends }
120 '__forall' { IT__forall }
121 '__letrec' { ITletrec }
122 '__coerce' { ITcoerce }
123 '__inline_me' { ITinlineMe }
124 '__inline_call'{ ITinlineCall }
125 '__DEFAULT' { ITdefaultbranch }
127 '__integer' { ITinteger_lit }
128 '__float' { ITfloat_lit }
129 '__word' { ITword_lit }
130 '__int64' { ITint64_lit }
131 '__word64' { ITword64_lit }
132 '__rational' { ITrational_lit }
133 '__addr' { ITaddr_lit }
134 '__label' { ITlabel_lit }
135 '__litlit' { ITlit_lit }
136 '__string' { ITstring_lit }
137 '__ccall' { ITccall $$ }
139 '__sccC' { ITsccAllCafs }
144 '__P' { ITspecialise }
146 '__U' { ITunfold $$ }
147 '__S' { ITstrict $$ }
150 '__D' { ITdeprecated }
152 '..' { ITdotdot } -- reserved symbols
164 '{' { ITocurly } -- special symbols
166 '{|' { ITocurlybar } -- special symbols
167 '|}' { ITccurlybar } -- special symbols
178 VARID { ITvarid $$ } -- identifiers
180 VARSYM { ITvarsym $$ }
181 CONSYM { ITconsym $$ }
182 QVARID { ITqvarid $$ }
183 QCONID { ITqconid $$ }
184 QVARSYM { ITqvarsym $$ }
185 QCONSYM { ITqconsym $$ }
187 IPVARID { ITipvarid $$ } -- GHC extension
189 PRAGMA { ITpragma $$ }
192 STRING { ITstring $$ }
193 INTEGER { ITinteger $$ }
194 RATIONAL { ITrational $$ }
195 CLITLIT { ITlitlit $$ }
197 UNKNOWN { ITunknown $$ }
200 iface :: { ParsedIface }
201 iface : '__interface' package mod_name
203 orphans checkVersion 'where'
209 rules_and_deprecs_part
211 pi_mod = mkModule $3 $2, -- Module itself
212 pi_vers = $4, -- Module version
214 pi_exports = (fst $5, $9), -- Exports
215 pi_usages = $10, -- Usages
216 pi_fixity = $11, -- Fixies
217 pi_insts = $12, -- Local instances
218 pi_decls = $13, -- Decls
219 pi_rules = (snd $5,fst $14), -- Rules
220 pi_deprecs = snd $14 -- Deprecations
223 -- Versions for exports and rules (optional)
224 sub_versions :: { (Version,Version) }
225 : '[' version version ']' { ($2,$3) }
226 | {- empty -} { (initialVersion, initialVersion) }
228 --------------------------------------------------------------------------
230 import_part :: { [ImportVersion OccName] }
232 | import_decl import_part { $1 : $2 }
234 import_decl :: { ImportVersion OccName }
235 import_decl : 'import' mod_name orphans is_boot whats_imported ';'
236 { ({-mkSysModuleNameFS-} $2, $3, $4, $5) }
238 orphans :: { WhetherHasOrphans }
242 is_boot :: { IsBootInterface }
246 whats_imported :: { WhatsImported OccName }
247 whats_imported : { NothingAtAll }
248 | '::' version { Everything $2 }
249 | '::' version version version name_version_pairs { Specifically $2 (Just $3) $5 $4 }
250 | '::' version version name_version_pairs { Specifically $2 Nothing $4 $3 }
252 name_version_pairs :: { [(OccName, Version)] }
253 name_version_pairs : { [] }
254 | name_version_pair name_version_pairs { $1 : $2 }
256 name_version_pair :: { (OccName, Version) }
257 name_version_pair : var_occ version { ($1, $2) }
258 | tc_occ version { ($1, $2) }
261 --------------------------------------------------------------------------
263 exports_part :: { [ExportItem] }
264 exports_part : { [] }
265 | '__export' mod_name entities ';'
266 exports_part { ({-mkSysModuleNameFS-} $2, $3) : $5 }
268 entities :: { [RdrAvailInfo] }
270 | entity entities { $1 : $2 }
272 entity :: { RdrAvailInfo }
273 entity : var_occ { Avail $1 }
274 | tc_occ { AvailTC $1 [$1] }
275 | tc_occ '|' stuff_inside { AvailTC $1 $3 }
276 | tc_occ stuff_inside { AvailTC $1 ($1:$2) }
277 -- Note that the "main name" comes at the beginning
279 stuff_inside :: { [OccName] }
280 stuff_inside : '{' val_occs '}' { $2 }
282 val_occ :: { OccName }
286 val_occs :: { [OccName] }
288 | val_occ val_occs { $1 : $2 }
291 --------------------------------------------------------------------------
293 fix_decl_part :: { [RdrNameFixitySig] }
294 fix_decl_part : {- empty -} { [] }
295 | fix_decls ';' { $1 }
297 fix_decls :: { [RdrNameFixitySig] }
299 | fix_decl fix_decls { $1 : $2 }
301 fix_decl :: { RdrNameFixitySig }
302 fix_decl : src_loc fixity prec var_or_data_name { FixitySig $4 (Fixity $3 $2) $1 }
304 fixity :: { FixityDirection }
305 fixity : 'infixl' { InfixL }
306 | 'infixr' { InfixR }
310 prec : INTEGER { fromInteger $1 }
312 -----------------------------------------------------------------------------
314 csigs :: { [RdrNameSig] }
316 | 'where' '{' csigs1 '}' { $3 }
318 csigs1 :: { [RdrNameSig] }
320 | csig ';' csigs1 { $1 : $3 }
322 csig :: { RdrNameSig }
323 csig : src_loc qvar_name '::' type { ClassOpSig $2 NoDefMeth $4 $1 }
324 | src_loc qvar_name ';' '::' type { ClassOpSig $2 GenDefMeth $5 $1 }
325 | src_loc qvar_name '=' '::' type { mkClassOpSigDM $2 $5 $1 }
327 --------------------------------------------------------------------------
329 instance_decl_part :: { [RdrNameInstDecl] }
330 instance_decl_part : {- empty -} { [] }
331 | instance_decl_part inst_decl { $2 : $1 }
333 inst_decl :: { RdrNameInstDecl }
334 inst_decl : src_loc 'instance' type '=' qvar_name ';'
336 EmptyMonoBinds {- No bindings -}
337 [] {- No user pragmas -}
338 (Just $5) {- Dfun id -}
342 --------------------------------------------------------------------------
344 decls_part :: { [(Version, RdrNameTyClDecl)] }
347 | opt_version decl ';' decls_part { ($1,$2):$4 }
349 decl :: { RdrNameTyClDecl }
350 decl : src_loc qvar_name '::' type maybe_idinfo
351 { IfaceSig $2 $4 ($5 $2) $1 }
352 | src_loc 'type' qtc_name tv_bndrs '=' type
353 { TySynonym $3 $4 $6 $1 }
354 | src_loc 'data' opt_decl_context qtc_name tv_bndrs constrs
355 { mkTyData DataType $3 $4 $5 $6 (length $6) Nothing $1 }
356 | src_loc 'newtype' opt_decl_context qtc_name tv_bndrs newtype_constr
357 { mkTyData NewType $3 $4 $5 $6 1 Nothing $1 }
358 | src_loc 'class' opt_decl_context qtc_name tv_bndrs fds csigs
359 { mkClassDecl $3 $4 $5 $6 $7 Nothing $1 }
361 maybe_idinfo :: { RdrName -> [HsIdInfo RdrName] }
362 maybe_idinfo : {- empty -} { \_ -> [] }
363 | pragma { \x -> if opt_IgnoreIfacePragmas then []
365 POk _ id_info -> id_info
366 PFailed err -> pprPanic "IdInfo parse failed"
370 If a signature decl is being loaded, and opt_IgnoreIfacePragmas is on,
371 we toss away unfolding information.
373 Also, if the signature is loaded from a module we're importing from source,
374 we do the same. This is to avoid situations when compiling a pair of mutually
375 recursive modules, peering at unfolding info in the interface file of the other,
376 e.g., you compile A, it looks at B's interface file and may as a result change
377 its interface file. Hence, B is recompiled, maybe changing its interface file,
378 which will the unfolding info used in A to become invalid. Simple way out is to
379 just ignore unfolding info.
381 [Jan 99: I junked the second test above. If we're importing from an hi-boot
382 file there isn't going to *be* any pragma info. The above comment
383 dates from a time where we picked up a .hi file first if it existed.]
386 pragma :: { ParseResult [HsIdInfo RdrName] }
387 pragma : src_loc PRAGMA { parseIdInfo $2 PState{ bol = 0#, atbol = 1#,
393 -----------------------------------------------------------------------------
395 rules_and_deprecs_part :: { ([RdrNameRuleDecl], IfaceDeprecs) }
396 rules_and_deprecs_part : {- empty -} { ([], Nothing) }
397 | rules_prag { case $1 of
399 PFailed err -> pprPanic "Rules/Deprecations parse failed" err
402 rules_prag :: { ParseResult ([RdrNameRuleDecl], IfaceDeprecs) }
403 rules_prag : src_loc PRAGMA { parseRules $2 PState{ bol = 0#, atbol = 1#,
409 rules_and_deprecs :: { ([RdrNameRuleDecl], IfaceDeprecs) }
410 rules_and_deprecs : rule_prag deprec_prag { ($1, $2) }
413 -----------------------------------------------------------------------------
415 rule_prag :: { [RdrNameRuleDecl] }
416 rule_prag : {- empty -} { [] }
419 rules :: { [RdrNameRuleDecl] }
421 | rule ';' rules { $1:$3 }
423 rule :: { RdrNameRuleDecl }
424 rule : src_loc STRING rule_forall qvar_name
425 core_args '=' core_expr { IfaceRule $2 $3 $4 $5 $7 $1 }
427 rule_forall :: { [UfBinder RdrName] }
428 rule_forall : '__forall' '{' core_bndrs '}' { $3 }
430 -----------------------------------------------------------------------------
432 deprec_prag :: { IfaceDeprecs }
433 deprec_prag : {- empty -} { Nothing }
434 | '__D' deprecs { Just $2 }
436 deprecs :: { Either DeprecTxt [(RdrName,DeprecTxt)] }
437 deprecs : STRING { Left $1 }
438 | deprec_list { Right $1 }
440 deprec_list :: { [(RdrName,DeprecTxt)] }
441 deprec_list : deprec { [$1] }
442 | deprec ';' deprec_list { $1 : $3 }
444 deprec :: { (RdrName,DeprecTxt) }
445 deprec : deprec_name STRING { ($1, $2) }
447 deprec_name :: { RdrName }
451 -----------------------------------------------------------------------------
453 version :: { Version }
454 version : INTEGER { fromInteger $1 }
456 opt_version :: { Version }
457 opt_version : version { $1 }
458 | {- empty -} { initialVersion }
460 opt_decl_context :: { RdrNameContext }
461 opt_decl_context : { [] }
462 | context '=>' { $1 }
464 ----------------------------------------------------------------------------
466 constrs :: { [RdrNameConDecl] {- empty for handwritten abstract -} }
468 | '=' constrs1 { $2 }
470 constrs1 :: { [RdrNameConDecl] }
471 constrs1 : constr { [$1] }
472 | constr '|' constrs1 { $1 : $3 }
474 constr :: { RdrNameConDecl }
475 constr : src_loc ex_stuff qdata_name batypes { mk_con_decl $3 $2 (VanillaCon $4) $1 }
476 | src_loc ex_stuff qdata_name '{' fields1 '}' { mk_con_decl $3 $2 (RecCon $5) $1 }
477 -- We use "data_fs" so as to include ()
479 newtype_constr :: { [RdrNameConDecl] {- Not allowed to be empty -} }
480 newtype_constr : src_loc '=' ex_stuff qdata_name atype { [mk_con_decl $4 $3 (VanillaCon [Unbanged $5]) $1] }
481 | src_loc '=' ex_stuff qdata_name '{' qvar_name '::' atype '}'
482 { [mk_con_decl $4 $3 (RecCon [([$6], Unbanged $8)]) $1] }
484 ex_stuff :: { ([HsTyVarBndr RdrName], RdrNameContext) }
485 ex_stuff : { ([],[]) }
486 | '__forall' tv_bndrs opt_context '=>' { ($2,$3) }
488 batypes :: { [RdrNameBangType] }
490 | batype batypes { $1 : $2 }
492 batype :: { RdrNameBangType }
493 batype : tatype { Unbanged $1 }
494 | '!' tatype { Banged $2 }
495 | '!' '!' tatype { Unpacked $3 }
497 fields1 :: { [([RdrName], RdrNameBangType)] }
498 fields1 : field { [$1] }
499 | field ',' fields1 { $1 : $3 }
501 field :: { ([RdrName], RdrNameBangType) }
502 field : qvar_names1 '::' ttype { ($1, Unbanged $3) }
503 | qvar_names1 '::' '!' ttype { ($1, Banged $4) }
504 | qvar_names1 '::' '!' '!' ttype { ($1, Unpacked $5) }
506 --------------------------------------------------------------------------
508 type :: { RdrNameHsType }
509 type : '__forall' tv_bndrs
510 opt_context '=>' type { mkHsForAllTy (Just $2) $3 $5 }
511 | btype '->' type { HsFunTy $1 $3 }
514 opt_context :: { RdrNameContext }
518 context :: { RdrNameContext }
519 context : '(' context_list1 ')' { $2 }
520 | '{' context_list1 '}' { $2 } -- Backward compatibility
522 context_list1 :: { RdrNameContext }
523 context_list1 : class { [$1] }
524 | class ',' context_list1 { $1 : $3 }
526 class :: { HsPred RdrName }
527 class : qcls_name atypes { (HsClassP $1 $2) }
528 | ipvar_name '::' type { (HsIParam $1 $3) }
530 types0 :: { [RdrNameHsType] {- Zero or more -} }
531 types0 : {- empty -} { [ ] }
535 types2 :: { [RdrNameHsType] {- Two or more -} }
536 types2 : type ',' type { [$1,$3] }
537 | type ',' types2 { $1 : $3 }
539 btype :: { RdrNameHsType }
541 | btype atype { HsAppTy $1 $2 }
542 | '__u' atype atype { HsUsageTy $2 $3 }
544 atype :: { RdrNameHsType }
545 atype : qtc_name { HsTyVar $1 }
546 | tv_name { HsTyVar $1 }
549 | '(' ')' { HsTupleTy (mkHsTupCon tcName Boxed []) [] }
550 | '(' types2 ')' { HsTupleTy (mkHsTupCon tcName Boxed $2) $2 }
551 | '(#' types0 '#)' { HsTupleTy (mkHsTupCon tcName Unboxed $2) $2 }
552 | '[' type ']' { HsListTy $2 }
553 | '{' qcls_name atypes '}' { mkHsDictTy $2 $3 }
554 | '{' ipvar_name '::' type '}' { mkHsIParamTy $2 $4 }
555 | '(' type ')' { $2 }
557 atypes :: { [RdrNameHsType] {- Zero or more -} }
559 | atype atypes { $1 : $2 }
560 --------------------------------------------------------------------------
562 -- versions of type/btype/atype that cant begin with '!' (or '.')
563 -- for use where the kind is definitely known NOT to be '$'
565 ttype :: { RdrNameHsType }
566 ttype : '__forall' tv_bndrs
567 opt_context '=>' type { mkHsForAllTy (Just $2) $3 $5 }
568 | tbtype '->' type { HsFunTy $1 $3 }
571 tbtype :: { RdrNameHsType }
572 tbtype : tatype { $1 }
573 | tbtype atype { HsAppTy $1 $2 }
574 | '__u' atype atype { HsUsageTy $2 $3 }
576 tatype :: { RdrNameHsType }
577 tatype : qtc_name { HsTyVar $1 }
578 | tv_name { HsTyVar $1 }
579 | '(' ')' { HsTupleTy (mkHsTupCon tcName Boxed []) [] }
580 | '(' types2 ')' { HsTupleTy (mkHsTupCon tcName Boxed $2) $2 }
581 | '(#' types0 '#)' { HsTupleTy (mkHsTupCon tcName Unboxed $2) $2 }
582 | '[' type ']' { HsListTy $2 }
583 | '{' qcls_name atypes '}' { mkHsDictTy $2 $3 }
584 | '{' ipvar_name '::' type '}' { mkHsIParamTy $2 $4 }
585 | '(' type ')' { $2 }
586 ---------------------------------------------------------------------
588 package :: { PackageName }
590 | {- empty -} { opt_InPackage } -- Useful for .hi-boot files,
591 -- which can omit the package Id
592 -- Module loops are always within a package
594 mod_name :: { ModuleName }
595 : CONID { mkSysModuleNameFS $1 }
598 ---------------------------------------------------
599 var_fs :: { EncodedFS }
602 | 'as' { SLIT("as") }
603 | 'qualified' { SLIT("qualified") }
604 | 'hiding' { SLIT("hiding") }
605 | 'forall' { SLIT("forall") }
606 | 'foreign' { SLIT("foreign") }
607 | 'export' { SLIT("export") }
608 | 'label' { SLIT("label") }
609 | 'dynamic' { SLIT("dynamic") }
610 | 'unsafe' { SLIT("unsafe") }
611 | 'with' { SLIT("with") }
612 | 'ccall' { SLIT("ccall") }
613 | 'stdcall' { SLIT("stdcall") }
615 qvar_fs :: { (EncodedFS, EncodedFS) }
619 var_occ :: { OccName }
620 : var_fs { mkSysOccFS varName $1 }
622 var_name :: { RdrName }
623 var_name : var_occ { mkRdrUnqual $1 }
625 qvar_name :: { RdrName }
626 qvar_name : var_name { $1 }
627 | qvar_fs { mkIfaceOrig varName $1 }
629 ipvar_name :: { RdrName }
630 : IPVARID { mkRdrUnqual (mkSysOccFS varName (tailFS $1)) }
632 qvar_names1 :: { [RdrName] }
633 qvar_names1 : qvar_name { [$1] }
634 | qvar_name qvar_names1 { $1 : $2 }
636 var_names :: { [RdrName] }
638 | var_name var_names { $1 : $2 }
640 var_names1 :: { [RdrName] }
641 var_names1 : var_name var_names { $1 : $2 }
643 ---------------------------------------------------
644 -- For some bizarre reason,
645 -- (,,,) is dealt with by the parser
646 -- Foo.(,,,) is dealt with by the lexer
649 data_fs :: { EncodedFS }
653 qdata_fs :: { (EncodedFS, EncodedFS) }
657 data_occ :: { OccName }
658 : data_fs { mkSysOccFS dataName $1 }
660 data_name :: { RdrName }
661 : data_occ { mkRdrUnqual $1 }
663 qdata_name :: { RdrName }
664 qdata_name : data_name { $1 }
665 | qdata_fs { mkIfaceOrig dataName $1 }
667 var_or_data_name :: { RdrName }
671 ---------------------------------------------------
672 tc_occ :: { OccName }
673 : data_fs { mkSysOccFS tcName $1 }
675 tc_name :: { RdrName }
676 : tc_occ { mkRdrUnqual $1 }
678 qtc_name :: { RdrName }
680 | qdata_fs { mkIfaceOrig tcName $1 }
682 ---------------------------------------------------
683 cls_name :: { RdrName }
684 : data_fs { mkRdrUnqual (mkSysOccFS clsName $1) }
686 qcls_name :: { RdrName }
688 | qdata_fs { mkIfaceOrig clsName $1 }
690 ---------------------------------------------------
691 tv_name :: { RdrName }
692 : VARID { mkRdrUnqual (mkSysOccFS tvName $1) }
694 tv_bndr :: { HsTyVarBndr RdrName }
695 : tv_name '::' akind { IfaceTyVar $1 $3 }
696 | tv_name { IfaceTyVar $1 liftedTypeKind }
698 tv_bndrs :: { [HsTyVarBndr RdrName] }
700 | '[' tv_bndrs1 ']' { $2 } -- Backward compatibility
702 tv_bndrs1 :: { [HsTyVarBndr RdrName] }
704 | tv_bndr tv_bndrs1 { $1 : $2 }
706 ---------------------------------------------------
707 fds :: { [([RdrName], [RdrName])] }
709 | '|' fds1 { reverse $2 }
711 fds1 :: { [([RdrName], [RdrName])] }
712 : fds1 ',' fd { $3 : $1 }
715 fd :: { ([RdrName], [RdrName]) }
716 : varids0 '->' varids0 { (reverse $1, reverse $3) }
718 varids0 :: { [RdrName] }
720 | varids0 tv_name { $2 : $1 }
722 ---------------------------------------------------
725 | akind '->' kind { mkArrowKind $1 $3 }
728 : VARSYM { if $1 == SLIT("*") then
730 else if $1 == SLIT("?") then
732 else if $1 == SLIT("\36") then
733 usageTypeKind -- dollar
734 else panic "ParseInterface: akind"
736 | '(' kind ')' { $2 }
738 --------------------------------------------------------------------------
740 id_info :: { [HsIdInfo RdrName] }
741 : id_info_item { [$1] }
742 | id_info_item id_info { $1 : $2 }
744 id_info_item :: { HsIdInfo RdrName }
745 : '__A' INTEGER { HsArity (fromInteger $2) }
746 | '__U' inline_prag core_expr { HsUnfold $2 $3 }
747 | '__M' { HsCprInfo }
748 | '__S' { HsStrictness (mkStrictnessInfo $1) }
749 | '__C' { HsNoCafRefs }
750 | '__P' qvar_name INTEGER { HsWorker $2 (fromInteger $3) }
752 inline_prag :: { InlinePragInfo }
753 : {- empty -} { NoInlinePragInfo }
754 | '[' from_prag phase ']' { IMustNotBeINLINEd $2 $3 }
756 from_prag :: { Bool }
757 : {- empty -} { True }
760 phase :: { Maybe Int }
761 : {- empty -} { Nothing }
762 | INTEGER { Just (fromInteger $1) }
764 -------------------------------------------------------
765 core_expr :: { UfExpr RdrName }
766 core_expr : '\\' core_bndrs '->' core_expr { foldr UfLam $4 $2 }
767 | 'case' core_expr 'of' var_name
768 '{' core_alts '}' { UfCase $2 $4 $6 }
770 | 'let' '{' core_val_bndr '=' core_expr
771 '}' 'in' core_expr { UfLet (UfNonRec $3 $5) $8 }
772 | '__letrec' '{' rec_binds '}'
773 'in' core_expr { UfLet (UfRec $3) $6 }
775 | '__litlit' STRING atype { UfLitLit $2 $3 }
779 fexpr :: { UfExpr RdrName }
780 fexpr : fexpr core_arg { UfApp $1 $2 }
781 | scc core_aexpr { UfNote (UfSCC $1) $2 }
782 | '__inline_me' core_aexpr { UfNote UfInlineMe $2 }
783 | '__inline_call' core_aexpr { UfNote UfInlineCall $2 }
784 | '__coerce' atype core_aexpr { UfNote (UfCoerce $2) $3 }
787 core_arg :: { UfExpr RdrName }
788 : '@' atype { UfType $2 }
791 core_args :: { [UfExpr RdrName] }
793 | core_arg core_args { $1 : $2 }
795 core_aexpr :: { UfExpr RdrName } -- Atomic expressions
796 core_aexpr : qvar_name { UfVar $1 }
797 | qdata_name { UfVar $1 }
799 | core_lit { UfLit $1 }
800 | '(' core_expr ')' { $2 }
802 | '(' ')' { UfTuple (mkHsTupCon dataName Boxed []) [] }
803 | '(' comma_exprs2 ')' { UfTuple (mkHsTupCon dataName Boxed $2) $2 }
804 | '(#' comma_exprs0 '#)' { UfTuple (mkHsTupCon dataName Unboxed $2) $2 }
806 | '{' '__ccall' ccall_string type '}'
808 (is_dyn, is_casm, may_gc) = $2
810 target | is_dyn = DynamicTarget (error "CCall dyn target bogus unique")
811 | otherwise = StaticTarget $3
813 ccall = CCall target is_casm may_gc cCallConv
819 comma_exprs0 :: { [UfExpr RdrName] } -- Zero or more
820 comma_exprs0 : {- empty -} { [ ] }
821 | core_expr { [ $1 ] }
822 | comma_exprs2 { $1 }
824 comma_exprs2 :: { [UfExpr RdrName] } -- Two or more
825 comma_exprs2 : core_expr ',' core_expr { [$1,$3] }
826 | core_expr ',' comma_exprs2 { $1 : $3 }
828 rec_binds :: { [(UfBinder RdrName, UfExpr RdrName)] }
830 | core_val_bndr '=' core_expr ';' rec_binds { ($1,$3) : $5 }
832 core_alts :: { [UfAlt RdrName] }
834 | core_alt ';' core_alts { $1 : $3 }
836 core_alt :: { UfAlt RdrName }
837 core_alt : core_pat '->' core_expr { (fst $1, snd $1, $3) }
839 core_pat :: { (UfConAlt RdrName, [RdrName]) }
840 core_pat : core_lit { (UfLitAlt $1, []) }
841 | '__litlit' STRING atype { (UfLitLitAlt $2 $3, []) }
842 | qdata_name core_pat_names { (UfDataAlt $1, $2) }
843 | '(' ')' { (UfTupleAlt (mkHsTupCon dataName Boxed []), []) }
844 | '(' comma_var_names1 ')' { (UfTupleAlt (mkHsTupCon dataName Boxed $2), $2) }
845 | '(#' comma_var_names1 '#)' { (UfTupleAlt (mkHsTupCon dataName Unboxed $2), $2) }
846 | '__DEFAULT' { (UfDefault, []) }
847 | '(' core_pat ')' { $2 }
849 core_pat_names :: { [RdrName] }
850 core_pat_names : { [] }
851 | core_pat_name core_pat_names { $1 : $2 }
853 -- Tyvar names and variable names live in different name spaces
854 -- so they need to be signalled separately. But we don't record
855 -- types or kinds in a pattern; we work that out from the type
856 -- of the case scrutinee
857 core_pat_name :: { RdrName }
858 core_pat_name : var_name { $1 }
861 comma_var_names1 :: { [RdrName] } -- One or more
862 comma_var_names1 : var_name { [$1] }
863 | var_name ',' comma_var_names1 { $1 : $3 }
865 core_lit :: { Literal }
866 core_lit : integer { mkMachInt $1 }
867 | CHAR { MachChar $1 }
868 | STRING { MachStr $1 }
869 | rational { MachDouble $1 }
870 | '__word' integer { mkMachWord $2 }
871 | '__word64' integer { mkMachWord64 $2 }
872 | '__int64' integer { mkMachInt64 $2 }
873 | '__float' rational { MachFloat $2 }
874 | '__addr' integer { MachAddr $2 }
875 | '__label' STRING { MachLabel $2 }
877 integer :: { Integer }
879 | '-' INTEGER { (-$2) }
881 rational :: { Rational }
883 | '-' RATIONAL { (-$2) }
885 core_bndr :: { UfBinder RdrName }
886 core_bndr : core_val_bndr { $1 }
887 | core_tv_bndr { $1 }
889 core_bndrs :: { [UfBinder RdrName] }
891 | core_bndr core_bndrs { $1 : $2 }
893 core_val_bndr :: { UfBinder RdrName }
894 core_val_bndr : var_name '::' atype { UfValBinder $1 $3 }
896 core_tv_bndr :: { UfBinder RdrName }
897 core_tv_bndr : '@' tv_name '::' akind { UfTyBinder $2 $4 }
898 | '@' tv_name { UfTyBinder $2 liftedTypeKind }
900 ccall_string :: { FAST_STRING }
906 ------------------------------------------------------------------------
907 scc :: { CostCentre }
908 : '__sccC' '{' mod_name '}' { AllCafsCC $3 }
909 | '__scc' '{' cc_name mod_name cc_dup cc_caf '}'
910 { NormalCC { cc_name = $3, cc_mod = $4,
911 cc_is_dupd = $5, cc_is_caf = $6 } }
913 cc_name :: { EncodedFS }
917 cc_dup :: { IsDupdCC }
918 cc_dup : { OriginalCC }
921 cc_caf :: { IsCafCC }
925 -------------------------------------------------------------------
927 src_loc :: { SrcLoc }
928 src_loc : {% getSrcLocP }
930 -- Check the project version: this makes sure
931 -- that the project version (e.g. 407) in the interface
932 -- file is the same as that for the compiler that's reading it
933 checkVersion :: { () }
934 : {-empty-} {% checkVersion Nothing }
935 | INTEGER {% checkVersion (Just (fromInteger $1)) }
937 -------------------------------------------------------------------
942 happyError buf PState{ loc = loc } = PFailed (ifaceParseErr buf loc)
944 mk_con_decl name (ex_tvs, ex_ctxt) details loc = mkConDecl name ex_tvs ex_ctxt details loc