[project @ 1999-03-02 17:12:54 by sof]
[ghc-hetmet.git] / ghc / compiler / rename / ParseIface.y
index 2eb828b..8fc0631 100644 (file)
@@ -9,9 +9,10 @@ import HsDecls         ( HsIdInfo(..), HsStrictnessInfo(..) )
 import HsTypes         ( mkHsForAllTy )
 import HsCore
 import Const           ( Literal(..), mkMachInt_safe )
-import BasicTypes      ( IfaceFlavour(..), Fixity(..), FixityDirection(..), 
+import BasicTypes      ( Fixity(..), FixityDirection(..), 
                          NewOrData(..), Version
                        )
+import CostCentre       ( CostCentre(..), IsDictCC(..), IsCafCC(..), IsDupdCC(..) )
 import HsPragmas       ( noDataPragmas, noClassPragmas )
 import Type            ( Kind, mkArrowKind, boxedTypeKind, openTypeKind )
 import IdInfo           ( ArityInfo, exactArity )
@@ -22,14 +23,24 @@ import RnMonad              ( ImportVersion, LocalVersion, ParsedIface(..), WhatsImported(..
                        ) 
 import Bag             ( emptyBag, unitBag, snocBag )
 import FiniteMap       ( emptyFM, unitFM, addToFM, plusFM, bagToFM, FiniteMap )
-import Name            ( OccName(..), isTCOcc, Provenance, Module,
-                         mkTupNameStr, mkUbxTupNameStr
+import RdrName          ( RdrName, mkRdrUnqual, mkSysQual, mkSysUnqual )
+import Name            ( OccName, Provenance )
+import OccName          ( mkSysOccFS,
+                         tcName, varName, dataName, clsName, tvName,
+                         EncodedFS 
                        )
+import Module           ( Module, mkSysModuleFS, IfaceFlavour, hiFile, hiBootFile )                    
+import PrelMods         ( mkTupNameStr, mkUbxTupNameStr )
+import PrelInfo         ( mkTupConRdrName, mkUbxTupConRdrName )
 import SrcLoc          ( SrcLoc )
 import Maybes
 import Outputable
 
 import GlaExts
+
+#if __HASKELL1__ > 4
+import Ratio ( (%) )
+#endif
 }
 
 %name      parseIface
@@ -79,8 +90,9 @@ import GlaExts
  '__litlit'    { ITlit_lit }
  '__string'    { ITstring_lit }
  '__ccall'     { ITccall $$ }
- '__scc'       { ITscc $$ }
- '__a'         { ITtypeapp }
+ '__scc'       { ITscc }
+ '__sccC'       { ITsccAllCafs }
+ '__sccD'       { ITsccAllDicts }
 
  '__A'         { ITarity }
  '__P'         { ITspecialise }
@@ -139,28 +151,27 @@ import GlaExts
 --              (c) the IdInfo part of a signature (same reason)
 
 iface_stuff :: { IfaceStuff }
-iface_stuff : iface            { PIface  $1 }
+iface_stuff : iface            { let (nm, iff) = $1 in PIface nm iff }
            | type              { PType   $1 }
            | id_info           { PIdInfo $1 }
 
 
-iface          :: { ParsedIface }
-iface          : '__interface' CONID INTEGER checkVersion 'where'
+iface          :: { (EncodedFS, ParsedIface) }
+iface          : '__interface' mod_fs INTEGER checkVersion 'where'
                   import_part
                  instance_import_part
                  exports_part
-                 fixities_part
                  instance_decl_part
                  decls_part
-                 { ParsedIface 
-                       $2                      -- Module name
+                 { ( $2                        -- Module name
+                   , ParsedIface 
                        (fromInteger $3)        -- Module version
                        (reverse $6)            -- Usages
                        (reverse $8)            -- Exports
                        (reverse $7)            -- Instance import modules
-                       (reverse $9)            -- Fixities
-                       (reverse $11)           -- Decls
-                       (reverse $10)           -- Local instances
+                       (reverse $10)           -- Decls
+                       (reverse $9)            -- Local instances
+                   )
                  }
 
 --------------------------------------------------------------------------
@@ -170,8 +181,8 @@ import_part :                                                 { [] }
            |  import_part import_decl                    { $2 : $1 }
            
 import_decl :: { ImportVersion OccName }
-import_decl : 'import' mod_name opt_bang INTEGER '::' whats_imported ';'
-                       { ($2, $3, fromInteger $4, $6) }
+import_decl : 'import' mod_fs opt_bang INTEGER '::' whats_imported ';'
+                       { (mkSysModuleFS $2 $3, fromInteger $4, $6) }
 
 whats_imported      :: { WhatsImported OccName }
 whats_imported      :                                           { Everything }
@@ -182,7 +193,8 @@ name_version_pairs  :                                               { [] }
                    |  name_version_pair name_version_pairs     { $1 : $2 }
 
 name_version_pair   :: { LocalVersion OccName }
-name_version_pair   :  entity_occ INTEGER                      { ($1, fromInteger $2) }
+name_version_pair   :  var_occ INTEGER                         { ($1, fromInteger $2) }
+                    |  tc_occ  INTEGER                          { ($1, fromInteger $2) }
 
 instance_import_part :: { [Module] }
 instance_import_part :                                                 {   []    }
@@ -193,38 +205,42 @@ instance_import_part :                                            {   []    }
 
 exports_part   :: { [ExportItem] }
 exports_part   :                                       { [] }
-               | exports_part '__export' opt_bang mod_name entities ';'
-                                               { ($4,$3,$5) : $1 }
+               | exports_part '__export' opt_bang mod_fs entities ';'
+                                               { (mkSysModuleFS $4 $3,$5) : $1 }
 
 opt_bang       :: { IfaceFlavour }
-opt_bang       :                                               { HiFile }
-               | '!'                                           { HiBootFile }
+opt_bang       :                                       { hiFile }
+               | '!'                                   { hiBootFile }
 
 entities       :: { [RdrAvailInfo] }
-entities       :                                               { [] }
-               |  entity entities                              { $1 : $2 }
+entities       :                                       { [] }
+               |  entity entities                      { $1 : $2 }
 
 entity         :: { RdrAvailInfo }
-entity         :  entity_occ                           { if isTCOcc $1 
-                                                         then AvailTC $1 [$1]
-                                                         else Avail $1 }
-               |  entity_occ stuff_inside              { AvailTC $1 ($1:$2) }
-               |  entity_occ '|' stuff_inside          { AvailTC $1 $3 }
+entity         :  tc_occ                               { AvailTC $1 [$1] }
+               |  var_occ                              { Avail $1 }
+               |  tc_occ stuff_inside                  { AvailTC $1 ($1:$2) }
+               |  tc_occ '|' stuff_inside              { AvailTC $1 $3 }
 
 stuff_inside   :: { [OccName] }
 stuff_inside   :  '{' val_occs '}'                     { $2 }
 
---------------------------------------------------------------------------
+val_occ                :: { OccName }
+               :  var_occ              { $1 }
+                |  data_occ             { $1 }
+
+val_occs       :: { [OccName] }
+               :  val_occ              { [$1] }
+               |  val_occ val_occs     { $1 : $2 }
 
-fixities_part   :: { [(OccName,Fixity)] }
-fixities_part   :                                              { [] }
-               | fixities_part fixity_decl ';'                 { $2 : $1 }
 
-fixity_decl     :: { (OccName,Fixity) }
-fixity_decl    : 'infixl' mb_fix val_occ       { ($3, Fixity $2 InfixL) }
-               | 'infixr' mb_fix val_occ       { ($3, Fixity $2 InfixR) }
-               | 'infix'  mb_fix val_occ       { ($3, Fixity $2 InfixN) }
+--------------------------------------------------------------------------
 
+fixity      :: { FixityDirection }
+fixity      : 'infixl'                                  { InfixL }
+            | 'infixr'                                  { InfixR }
+            | 'infix'                                   { InfixN }
+   
 mb_fix      :: { Int }
 mb_fix     : {-nothing-}                               { 9 }
            | INTEGER                                   { (fromInteger $1) }
@@ -272,21 +288,24 @@ decl      :: { RdrNameHsDecl }
 decl    : src_loc var_name '::' type maybe_idinfo
                         { SigD (IfaceSig $2 $4 ($5 $2) $1) }
        | src_loc 'type' tc_name tv_bndrs '=' type                     
-                       { TyD (TySynonym $3 $4 $6 $1) }
-       | src_loc 'data' decl_context data_fs tv_bndrs constrs         
-                       { TyD (TyData DataType $3 (Unqual (TCOcc $4)) $5 $6 Nothing noDataPragmas $1) }
+                       { TyClD (TySynonym $3 $4 $6 $1) }
+       | src_loc 'data' decl_context tc_name tv_bndrs constrs         
+                       { TyClD (TyData DataType $3 $4 $5 $6 Nothing noDataPragmas $1) }
        | src_loc 'newtype' decl_context tc_name tv_bndrs newtype_constr
-                       { TyD (TyData NewType $3 $4 $5 $6 Nothing noDataPragmas $1) }
+                       { TyClD (TyData NewType $3 $4 $5 $6 Nothing noDataPragmas $1) }
        | src_loc 'class' decl_context tc_name tv_bndrs csigs
-                       { ClD (mkClassDecl $3 $4 $5 $6 EmptyMonoBinds 
+                       { TyClD (mkClassDecl $3 $4 $5 $6 EmptyMonoBinds 
                                        noClassPragmas $1) }
+        | src_loc fixity mb_fix var_or_data_name
+                        { FixD (FixitySig $4 (Fixity $3 $2) $1) }
+
 maybe_idinfo  :: { RdrName -> [HsIdInfo RdrName] }
 maybe_idinfo  : {- empty -}    { \_ -> [] }
              | src_loc PRAGMA  { \x -> 
                                   case parseIface $2 $1 of
                                     Succeeded (PIdInfo id_info) -> id_info
-                                    other -> pprPanic "IdInfo parse failed" 
-                                               (ppr x)
+                                    Failed err -> pprPanic "IdInfo parse failed" 
+                                                           (vcat [ppr x, err])
                                }
 
 -----------------------------------------------------------------------------
@@ -309,13 +328,15 @@ constrs1  :  constr               { [$1] }
                |  constr '|' constrs1  { $1 : $3 }
 
 constr         :: { RdrNameConDecl }
-constr         :  src_loc ex_stuff data_fs batypes             { mkConDecl (Unqual (VarOcc $3)) $2 (VanillaCon $4) $1 }
-               |  src_loc ex_stuff data_fs '{' fields1 '}'     { mkConDecl (Unqual (VarOcc $3)) $2 (RecCon $5)     $1 }
+constr         :  src_loc ex_stuff data_name batypes           { mkConDecl $3 $2 (VanillaCon $4) $1 }
+               |  src_loc ex_stuff data_name '{' fields1 '}'   { mkConDecl $3 $2 (RecCon $5)     $1 }
                 -- We use "data_fs" so as to include ()
 
 newtype_constr :: { [RdrNameConDecl] {- Empty if handwritten abstract -} }
 newtype_constr :                                       { [] }
-               | src_loc '=' ex_stuff data_name atype  { [mkConDecl $4 $3 (NewCon $5) $1] }
+               | src_loc '=' ex_stuff data_name atype  { [mkConDecl $4 $3 (NewCon $5 Nothing) $1] }
+               | src_loc '=' ex_stuff data_name '{' var_name '::' atype '}'
+                                                       { [mkConDecl $4 $3 (NewCon $8 (Just $6)) $1] }
 
 ex_stuff :: { ([HsTyVar RdrName], RdrNameContext) }
 ex_stuff       :                                       { ([],[]) }
@@ -356,7 +377,7 @@ context_list1       : class                                 { [$1] }
                | class ',' context_list1               { $1 : $3 }
 
 class          :: { (RdrName, [RdrNameHsType]) }
-class          :  qtc_name atypes                      { ($1, $2) }
+class          :  qcls_name atypes                     { ($1, $2) }
 
 types2         :: { [RdrNameHsType]                    {- Two or more -}  }    
 types2         :  type ',' type                        { [$1,$3] }
@@ -369,59 +390,48 @@ btype             :  atype                                { $1 }
 atype          :: { RdrNameHsType }
 atype          :  qtc_name                             { MonoTyVar $1 }
                |  tv_name                              { MonoTyVar $1 }
-               |  '(' ')'                              { MonoTupleTy [] True }
                |  '(' types2 ')'                       { MonoTupleTy $2 True{-boxed-} }
                |  '(#' type '#)'                       { MonoTupleTy [$2] False{-unboxed-} }
                |  '(#' types2 '#)'                     { MonoTupleTy $2 False{-unboxed-} }
                |  '[' type ']'                         { MonoListTy  $2 }
-               |  '{' qtc_name atypes '}'              { MonoDictTy $2 $3 }
+               |  '{' qcls_name atypes '}'             { MonoDictTy $2 $3 }
                |  '(' type ')'                         { $2 }
 
+-- This one is dealt with via qtc_name
+--             |  '(' ')'                              { MonoTupleTy [] True }
+
 atypes         :: { [RdrNameHsType]    {-  Zero or more -} }
 atypes         :                                       { [] }
                |  atype atypes                         { $1 : $2 }
 ---------------------------------------------------------------------
+mod_fs         :: { EncodedFS }
+               :  CONID                { $1 }
 
 mod_name       :: { Module }
-               :  CONID                { $1 }
+               :  mod_fs               { mkSysModuleFS $1 hiFile }
+
 
-var_fs         :: { FAST_STRING }
+---------------------------------------------------
+var_fs         :: { EncodedFS }
                : VARID                 { $1 }
                | VARSYM                { $1 }
                | '-'                   { SLIT("-") }
                | '!'                   { SLIT("!") }
 
-data_fs         :: { FAST_STRING }
-               :  CONID                { $1 }
-               |  CONSYM               { $1 }
-               |  '->'                 { SLIT("->") }
-                |  '(' ')'             { SLIT("()") }
-               |  '(' commas ')'       { snd (mkTupNameStr $2) }
-               |  '[' ']'              { SLIT("[]") }
-
-commas         :: { Int }
-               : ','                   { 2 }
-               | commas ','            { $1 + 1 }
 
-val_occ                :: { OccName }
-               :  var_fs               { VarOcc $1 }
-                |  data_fs              { VarOcc $1 }
+qvar_fs                :: { (EncodedFS, EncodedFS, IfaceFlavour) }
+               :  QVARID               { $1 }
+               |  QVARSYM              { $1 }
 
-val_occs       :: { [OccName] }
-               :  val_occ              { [$1] }
-               |  val_occ val_occs     { $1 : $2 }
-
-entity_occ     :: { OccName }
-               :  var_fs               { VarOcc $1 }
-               |  data_fs              { TCOcc $1 }
+var_occ                :: { OccName }
+               :  var_fs               { mkSysOccFS varName $1 }
 
 var_name       :: { RdrName }
-var_name       :  var_fs               { Unqual (VarOcc $1) }
+var_name       :  var_occ              { mkRdrUnqual $1 }
 
 qvar_name      :: { RdrName }
 qvar_name      :  var_name             { $1 }
-               |  QVARID               { lexVarQual $1 }
-               |  QVARSYM              { lexVarQual $1 }
+               |  qvar_fs              { mkSysQual varName $1 }
 
 var_names      :: { [RdrName] }
 var_names      :                       { [] }
@@ -430,45 +440,74 @@ var_names :                       { [] }
 var_names1     :: { [RdrName] }
 var_names1     : var_name var_names    { $1 : $2 }
 
+---------------------------------------------------
+-- For some bizarre reason, 
+--      (,,,)      is dealt with by the parser
+--      Foo.(,,,)  is dealt with by the lexer
+-- Sigh
+
+data_fs                :: { EncodedFS }
+               :  CONID                { $1 }
+               |  CONSYM               { $1 }
+
+qdata_fs       :: { (EncodedFS, EncodedFS, IfaceFlavour) }
+                :  QCONID              { $1 }
+                |  QCONSYM             { $1 }
+
+data_occ       :: { OccName }
+               :  data_fs              { mkSysOccFS dataName $1 }
+
 data_name      :: { RdrName }
-               :  CONID                { Unqual (VarOcc $1) }
-               |  CONSYM               { Unqual (VarOcc $1) }
-               |  '(' commas ')'       { Unqual (VarOcc (snd (mkTupNameStr $2))) }
-               |  '[' ']'              { Unqual (VarOcc SLIT("[]")) }
+                :  data_occ             { mkRdrUnqual $1 }
 
 qdata_name     :: { RdrName }
 qdata_name     :  data_name            { $1 }
-               |  QCONID               { lexVarQual $1 }
-               |  QCONSYM              { lexVarQual $1 }
+               |  qdata_fs             { mkSysQual dataName $1 }
                                
 qdata_names    :: { [RdrName] }
 qdata_names    :                               { [] }
                | qdata_name qdata_names        { $1 : $2 }
 
+var_or_data_name :: { RdrName }
+                  : var_name                    { $1 }
+                  | data_name                   { $1 }
+
+---------------------------------------------------
+tc_fs           :: { EncodedFS }
+                :  data_fs              { $1 }
+
+tc_occ         :: { OccName }
+               :  tc_fs                { mkSysOccFS tcName $1 }
+
 tc_name                :: { RdrName }
-tc_name                :  CONID                { Unqual (TCOcc $1) }
-               |  CONSYM               { Unqual (TCOcc $1) }
-               |  '(' '->' ')'         { Unqual (TCOcc SLIT("->")) }
-               |  '(' commas ')'       { Unqual (TCOcc (snd (mkTupNameStr $2))) }
-               |  '[' ']'              { Unqual (TCOcc SLIT("[]")) }
+                :  tc_occ              { mkRdrUnqual $1 }
 
 qtc_name       :: { RdrName }
-qtc_name       : tc_name               { $1 }
-               | QCONID                { lexTcQual $1 }
-               | QCONSYM               { lexTcQual $1 }
+                : tc_name              { $1 }
+               | qdata_fs              { mkSysQual tcName $1 }
 
+---------------------------------------------------
+cls_name       :: { RdrName }
+               :  data_fs              { mkSysUnqual clsName $1 }
+
+qcls_name      :: { RdrName }
+               : cls_name              { $1 }
+               | qdata_fs              { mkSysQual clsName $1 }
+
+---------------------------------------------------
 tv_name                :: { RdrName }
-tv_name                :  VARID                { Unqual (TvOcc $1) }
-               |  VARSYM               { Unqual (TvOcc $1) {- Allow t2 as a tyvar -} }
+               :  VARID                { mkSysUnqual tvName $1 }
+               |  VARSYM               { mkSysUnqual tvName $1 {- Allow t2 as a tyvar -} }
 
 tv_bndr                :: { HsTyVar RdrName }
-tv_bndr                :  tv_name '::' akind   { IfaceTyVar $1 $3 }
-               |  tv_name              { UserTyVar $1 }
+               :  tv_name '::' akind   { IfaceTyVar $1 $3 }
+               |  tv_name              { IfaceTyVar $1 boxedTypeKind }
 
 tv_bndrs       :: { [HsTyVar RdrName] }
                :                       { [] }
                | tv_bndr tv_bndrs      { $1 : $2 }
 
+---------------------------------------------------
 kind           :: { Kind }
                : akind                 { $1 }
                | akind '->' kind       { mkArrowKind $1 $3 }
@@ -476,7 +515,7 @@ kind                :: { Kind }
 akind          :: { Kind }
                : VARSYM                { if $1 == SLIT("*") then
                                                boxedTypeKind
-                                         else if $1 == SLIT("**") then
+                                         else if $1 == SLIT("?") then
                                                openTypeKind
                                          else panic "ParseInterface: akind"
                                        }
@@ -491,7 +530,6 @@ id_info             :                               { [] }
 id_info_item   :: { HsIdInfo RdrName }
 id_info_item   : '__A' arity_info              { HsArity $2 }
                | strict_info                   { HsStrictness $1 }
-               | '__bot'                       { HsStrictness HsBottom }
                | '__U' core_expr               { HsUnfold $1 (Just $2) }
                 | '__U'                        { HsUnfold $1 Nothing }
                 | '__P' spec_tvs
@@ -526,17 +564,17 @@ core_expr : '\\' core_bndrs '->' core_expr        { foldr UfLam $4 $2 }
                | con_or_primop '{' core_args '}'       { UfCon $1 $3 }
                 | '__litlit' STRING atype               { UfCon (UfLitLitCon $2 $3) [] }
 
-                | '__inline' core_expr               { UfNote UfInlineCall $2 }
-                | '__coerce' atype core_expr         { UfNote (UfCoerce $2) $3 }
-               | '__scc' core_expr                  { UfNote (UfSCC $1) $2  }
-               | fexpr                              { $1 }
+                | '__inline' core_expr                  { UfNote UfInlineCall $2 }
+                | '__coerce' atype core_expr            { UfNote (UfCoerce $2) $3 }
+               | scc core_expr                         { UfNote (UfSCC $1) $2  }
+               | fexpr                                 { $1 }
 
 fexpr   :: { UfExpr RdrName }
 fexpr   : fexpr core_arg                               { UfApp $1 $2 }
         | core_aexpr                                   { $1 }
 
 core_arg       :: { UfExpr RdrName }
-               : '__a' atype                                  { UfType $2 }
+               : '@' atype                                     { UfType $2 }
                 | core_aexpr                                    { $1 }
 
 core_args      :: { [UfExpr RdrName] }
@@ -558,11 +596,13 @@ core_aexpr      : qvar_name                                       { UfVar $1 }
 
                | core_lit               { UfCon (UfLitCon $1) [] }
                | '(' core_expr ')'      { $2 }
-               | '('  ')'               { UfTuple (mkTupConRdrName 0) [] }
                | '(' comma_exprs2 ')'   { UfTuple (mkTupConRdrName (length $2)) $2 }
                | '(#' core_expr '#)'    { UfTuple (mkUbxTupConRdrName 1) [$2] }
                | '(#' comma_exprs2 '#)' { UfTuple (mkUbxTupConRdrName (length $2)) $2 }
 
+-- This one is dealt with by qdata_name: see above comments
+--             | '('  ')'               { UfTuple (mkTupConRdrName 0) [] }
+
 comma_exprs2   :: { [UfExpr RdrName] } -- Two or more
 comma_exprs2   : core_expr ',' core_expr                       { [$1,$3] }
                | core_expr ',' comma_exprs2                    { $1 : $3 }
@@ -571,9 +611,9 @@ con_or_primop   :: { UfCon RdrName }
 con_or_primop   : qdata_name                    { UfDataCon $1 }
                 | qvar_name                    { UfPrimOp $1 }
                 | '__ccall' ccall_string      { let
-                                               (is_casm, may_gc) = $1
+                                               (is_dyn, is_casm, may_gc) = $1
                                                in
-                                               UfCCallOp $2 is_casm may_gc
+                                               UfCCallOp $2 is_dyn is_casm may_gc
                                                }
 
 rec_binds      :: { [(UfBinder RdrName, UfExpr RdrName)] }
@@ -591,16 +631,12 @@ core_pat  :: { (UfCon RdrName, [RdrName]) }
 core_pat       : core_lit                      { (UfLitCon  $1, []) }
                | '__litlit' STRING atype       { (UfLitLitCon $2 $3, []) }
                | qdata_name var_names          { (UfDataCon $1, $2) }
-               | '(' comma_var_names ')'       { (UfDataCon (mkTupConRdrName (length $2)), $2) }
+               | '(' comma_var_names1 ')'      { (UfDataCon (mkTupConRdrName (length $2)), $2) }
                | '(#' comma_var_names1 '#)'    { (UfDataCon (mkUbxTupConRdrName (length $2)), $2) }
                | '__DEFAULT'                   { (UfDefault, []) }
                | '(' core_pat ')'              { $2 }
 
 
-comma_var_names :: { [RdrName] }       -- Zero, or two or more
-comma_var_names :                                              { [] }
-               | var_name ',' comma_var_names1         { $1 : $3 }
-
 comma_var_names1 :: { [RdrName] }      -- One or more
 comma_var_names1 : var_name                                    { [$1] }
                 | var_name ',' comma_var_names1                { $1 : $3 }
@@ -636,14 +672,39 @@ core_val_bndr     :: { UfBinder RdrName }
 core_val_bndr  : var_name '::' atype                           { UfValBinder $1 $3 }
 
 core_tv_bndr   :: { UfBinder RdrName }
-core_tv_bndr   :  '__a' tv_name '::' akind             { UfTyBinder $2 $4 }
-               |  '__a' tv_name                        { UfTyBinder $2 boxedTypeKind }
+core_tv_bndr   :  '@' tv_name '::' akind               { UfTyBinder $2 $4 }
+               |  '@' tv_name                          { UfTyBinder $2 boxedTypeKind }
 
 ccall_string   :: { FAST_STRING }
                : STRING                                        { $1 }
                | VARID                                         { $1 }
                | CONID                                         { $1 }
 
+------------------------------------------------------------------------
+scc     :: { CostCentre }
+        :  '__sccC' '{' mod_name STRING '}'                      { AllCafsCC $3 $4 }
+        |  '__sccD' '{' mod_name STRING cc_dup '}'               { AllDictsCC $3 $4 $5 }
+        |  '__scc' '(' cc_name mod_name STRING cc_dict cc_dup cc_caf '}'
+                             { NormalCC { cc_name = $3, cc_mod = $4, cc_grp = $5,
+                                          cc_is_dict = $6, cc_is_dupd = $7, cc_is_caf = $8 } }
+
+cc_name :: { EncodedFS }
+        : CONID                 { $1 }
+        | VARID                 { $1 }
+  
+cc_dup  :: { IsDupdCC }
+cc_dup  :                       { OriginalCC }
+        | '!'                   { DupdCC }
+
+cc_caf  :: { IsCafCC }
+        :                       { NotCafCC }
+        | '__C'                 { CafCC }
+
+cc_dict :: { IsDictCC }
+        :                       { VanillaCC }
+        | '__A'                 { DictCC }
+
+
 -------------------------------------------------------------------
 
 src_loc :: { SrcLoc }
@@ -658,7 +719,7 @@ checkVersion :: { () }
 --                     Haskell code 
 {
 
-data IfaceStuff = PIface       ParsedIface
+data IfaceStuff = PIface       EncodedFS{-.hi module name-} ParsedIface
                | PIdInfo       [HsIdInfo RdrName]
                | PType         RdrNameHsType