[project @ 2001-11-19 16:34:12 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / ParseIface.y
index 4a942ea..1fd883c 100644 (file)
@@ -36,17 +36,14 @@ import HsSyn                -- quite a bit of stuff
 import RdrHsSyn                -- oodles of synonyms
 import HsTypes         ( mkHsForAllTy, mkHsTupCon )
 import HsCore
-import Demand          ( mkStrictnessInfo )
 import Literal         ( Literal(..), mkMachInt, mkMachInt64, mkMachWord, mkMachWord64 )
-import BasicTypes      ( Fixity(..), FixityDirection(..), 
-                         NewOrData(..), Version, initialVersion, Boxity(..)
+import BasicTypes      ( Fixity(..), FixityDirection(..), StrictnessMark(..),
+                         NewOrData(..), Version, initialVersion, Boxity(..),
+                          Activation(..)
                        )
 import CostCentre       ( CostCentre(..), IsCafCC(..), IsDupdCC(..) )
-import Demand          ( StrictnessMark(..) )
-import CallConv         ( cCallConv )
 import Type            ( Kind, mkArrowKind, liftedTypeKind, openTypeKind, usageTypeKind )
-import IdInfo           ( InlinePragInfo(..) )
-import PrimOp           ( CCall(..), CCallTarget(..) )
+import ForeignCall     ( ForeignCall(..), CCallConv(..), CCallSpec(..), CCallTarget(..) )
 import Lex             
 
 import RnMonad         ( ParsedIface(..), ExportItem, IfaceDeprecs ) 
@@ -144,7 +141,7 @@ import FastString   ( tailFS )
  '__A'         { ITarity }
  '__P'         { ITspecialise }
  '__C'         { ITnocaf }
- '__U'         { ITunfold $$ }
+ '__U'         { ITunfold }
  '__S'         { ITstrict $$ }
  '__R'         { ITrules }
  '__M'         { ITcprinfo }
@@ -352,6 +349,8 @@ decl    : src_loc qvar_name '::' type maybe_idinfo
                        { IfaceSig $2 $4 ($5 $2) $1 }
        | src_loc 'type' qtc_name tv_bndrs '=' type                    
                        { TySynonym $3 $4 $6 $1 }
+       | src_loc 'foreign' 'type' qtc_name                    
+                       { ForeignType $4 Nothing DNType $1 }
        | src_loc 'data' opt_decl_context qtc_name tv_bndrs constrs            
                        { mkTyData DataType $3 $4 $5 $6 (length $6) Nothing $1 }
        | src_loc 'newtype' opt_decl_context qtc_name tv_bndrs newtype_constr
@@ -422,8 +421,12 @@ rules         :: { [RdrNameRuleDecl] }
           | rule ';' rules     { $1:$3 }
 
 rule      :: { RdrNameRuleDecl }
-rule      : src_loc STRING rule_forall qvar_name 
-            core_args '=' core_expr    { IfaceRule $2 $3 $4 $5 $7 $1 } 
+rule      : src_loc STRING activation rule_forall qvar_name 
+            core_args '=' core_expr    { IfaceRule $2 $3 $4 $5 $6 $8 $1 } 
+
+activation :: { Activation }
+activation : {- empty -}                { AlwaysActive }
+           | '[' INTEGER ']'            { ActiveAfter (fromInteger $2) }
 
 rule_forall    :: { [UfBinder RdrName] }
 rule_forall    : '__forall' '{' core_bndrs '}' { $3 }
@@ -588,18 +591,18 @@ tatype            :  qtc_name                             { HsTyVar $1 }
 
 package                :: { PackageName }
                :  STRING               { $1 }
-               | {- empty -}           { opt_InPackage }       -- Useful for .hi-boot files,
-                                                               -- which can omit the package Id
-                                                               -- Module loops are always within a package
+               | {- empty -}           { opt_InPackage }
+                               -- Useful for .hi-boot files,
+                               -- which can omit the package Id
+                               -- Module loops are always within a package
 
 mod_name       :: { ModuleName }
                :  CONID                { mkSysModuleNameFS $1 }
 
 
 ---------------------------------------------------
-var_fs         :: { EncodedFS }
+var_fs          :: { EncodedFS }
                : VARID                 { $1 }
-               | '!'                   { SLIT("!") }
                | 'as'                  { SLIT("as") }
                | 'qualified'           { SLIT("qualified") }
                | 'hiding'              { SLIT("hiding") }
@@ -613,10 +616,6 @@ var_fs             :: { EncodedFS }
                | 'ccall'               { SLIT("ccall") }
                | 'stdcall'             { SLIT("stdcall") }
 
-qvar_fs                :: { (EncodedFS, EncodedFS) }
-               :  QVARID               { $1 }
-               |  QVARSYM              { $1 }
-
 var_occ                :: { OccName }
                :  var_fs               { mkSysOccFS varName $1 }
 
@@ -625,7 +624,7 @@ var_name    :  var_occ              { mkRdrUnqual $1 }
 
 qvar_name      :: { RdrName }
 qvar_name      :  var_name             { $1 }
-               |  qvar_fs              { mkIfaceOrig varName $1 }
+               |  QVARID               { mkIfaceOrig varName $1 }
 
 ipvar_name     :: { RdrName }
                :  IPVARID              { mkRdrUnqual (mkSysOccFS varName (tailFS $1)) }
@@ -642,55 +641,34 @@ 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) }
-                :  QCONID              { $1 }
-                |  QCONSYM             { $1 }
 
 data_occ       :: { OccName }
-               :  data_fs              { mkSysOccFS dataName $1 }
-
-data_name      :: { RdrName }
-                :  data_occ             { mkRdrUnqual $1 }
+               :  CONID                { mkSysOccFS dataName $1 }
 
 qdata_name     :: { RdrName }
-qdata_name     :  data_name            { $1 }
-               |  qdata_fs             { mkIfaceOrig dataName $1 }
+               :  data_occ             { mkRdrUnqual $1 }
+               |  QCONID               { mkIfaceOrig dataName $1 }
                                
 var_or_data_name :: { RdrName }
-                  : qvar_name                    { $1 }
-                  | qdata_name                   { $1 }
+                  : qvar_name          { $1 }
+                  | qdata_name         { $1 }
 
 ---------------------------------------------------
 tc_occ         :: { OccName }
-               :  data_fs              { mkSysOccFS tcName $1 }
-
-tc_name                :: { RdrName }
-                :  tc_occ              { mkRdrUnqual $1 }
+               :  CONID                { mkSysOccFS tcName $1 }
 
 qtc_name       :: { RdrName }
-                : tc_name              { $1 }
-               | qdata_fs              { mkIfaceOrig tcName $1 }
+                : tc_occ               { mkRdrUnqual $1 }
+               | QCONID                { mkIfaceOrig tcName $1 }
 
 ---------------------------------------------------
-cls_name       :: { RdrName }
-               :  data_fs              { mkRdrUnqual (mkSysOccFS clsName $1) }
-
 qcls_name      :: { RdrName }
-               : cls_name              { $1 }
-               | qdata_fs              { mkIfaceOrig clsName $1 }
+               : CONID                 { mkRdrUnqual (mkSysOccFS clsName $1) }
+               | QCONID                { mkIfaceOrig clsName $1 }
 
 ---------------------------------------------------
 tv_name                :: { RdrName }
-               :  VARID                { mkRdrUnqual (mkSysOccFS tvName $1) }
+               :  var_fs               { mkRdrUnqual (mkSysOccFS tvName $1) }
 
 tv_bndr                :: { HsTyVarBndr RdrName }
                :  tv_name '::' akind   { IfaceTyVar $1 $3 }
@@ -744,24 +722,11 @@ id_info           :: { [HsIdInfo RdrName] }
 
 id_info_item   :: { HsIdInfo RdrName }
                : '__A' INTEGER                 { HsArity (fromInteger $2) }
-               | '__U' inline_prag core_expr   { HsUnfold $2 $3 }
-               | '__M'                         { HsCprInfo }
-               | '__S'                         { HsStrictness (mkStrictnessInfo $1) }
+               | '__U' activation core_expr    { HsUnfold $2 $3 }
+               | '__S'                         { HsStrictness $1 }
                | '__C'                         { HsNoCafRefs }
                | '__P' qvar_name INTEGER       { HsWorker $2 (fromInteger $3) }
 
-inline_prag     :: { InlinePragInfo }
-                :  {- empty -}                  { NoInlinePragInfo }
-               | '[' from_prag phase ']'       { IMustNotBeINLINEd $2 $3 }
-
-from_prag      :: { Bool }
-               : {- empty -}                   { True }
-               | '!'                           { False }
-
-phase          :: { Maybe Int }
-               : {- empty -}                   { Nothing }
-               | INTEGER                       { Just (fromInteger $1) }
-
 -------------------------------------------------------
 core_expr      :: { UfExpr RdrName }
 core_expr      : '\\' core_bndrs '->' core_expr        { foldr UfLam $4 $2 }
@@ -808,12 +773,13 @@ core_aexpr      : qvar_name                                       { UfVar $1 }
                            { let
                                  (is_dyn, is_casm, may_gc) = $2
 
-                                target | is_dyn    = DynamicTarget (error "CCall dyn target bogus unique")
+                                target | is_dyn    = DynamicTarget
+                                       | is_casm   = CasmTarget $3
                                        | otherwise = StaticTarget $3
 
-                                ccall = CCall target is_casm may_gc cCallConv
+                                ccall = CCallSpec target CCallConv may_gc
                             in
-                            UfCCall ccall $4
+                            UfFCall (CCall ccall) $4
                           }