[project @ 2001-10-18 09:17:04 by simonmar]
[ghc-hetmet.git] / ghc / compiler / rename / ParseIface.y
index f2882c3..96b701e 100644 (file)
@@ -28,7 +28,7 @@ Import declarations
 
 
 {
-module ParseIface ( parseIface, IfaceStuff(..) ) where
+module ParseIface ( parseIface, parseType, parseRules, parseIdInfo ) where
 
 #include "HsVersions.h"
 
@@ -36,16 +36,15 @@ 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 CallConv         ( cCallConv )
-import Type            ( Kind, mkArrowKind, boxedTypeKind, openTypeKind, usageTypeKind )
-import IdInfo           ( exactArity, InlinePragInfo(..) )
-import PrimOp           ( CCall(..), CCallTarget(..) )
+import Type            ( Kind, mkArrowKind, liftedTypeKind, openTypeKind, usageTypeKind )
+import IdInfo           ( InlinePragInfo(..) )
+import ForeignCall     ( ForeignCall(..), CCallConv(..), CCallSpec(..), CCallTarget(..) )
 import Lex             
 
 import RnMonad         ( ParsedIface(..), ExportItem, IfaceDeprecs ) 
@@ -56,7 +55,7 @@ import HscTypes         ( WhetherHasOrphans, IsBootInterface, GenAvailInfo(..),
 import RdrName          ( RdrName, mkRdrUnqual, mkIfaceOrig )
 import Name            ( OccName )
 import OccName          ( mkSysOccFS,
-                         tcName, varName, ipName, dataName, clsName, tvName,
+                         tcName, varName, dataName, clsName, tvName,
                          EncodedFS 
                        )
 import Module           ( ModuleName, PackageName, mkSysModuleNameFS, mkModule )
@@ -69,7 +68,11 @@ import GlaExts
 import FastString      ( tailFS )
 }
 
-%name      parseIface
+%name      parseIface      iface
+%name      parseType       type
+%name      parseIdInfo     id_info
+%name      parseRules      rules_and_deprecs
+
 %tokentype  { Token }
 %monad     { P }{ thenP }{ returnP }
 %lexer      { lexer } { ITeof }
@@ -139,7 +142,7 @@ import FastString   ( tailFS )
  '__A'         { ITarity }
  '__P'         { ITspecialise }
  '__C'         { ITnocaf }
- '__U'         { ITunfold $$ }
+ '__U'         { ITunfold }
  '__S'         { ITstrict $$ }
  '__R'         { ITrules }
  '__M'         { ITcprinfo }
@@ -193,17 +196,6 @@ import FastString  ( tailFS )
  UNKNOWN       { ITunknown  $$ }
 %%
 
--- iface_stuff is the main production.
--- It recognises (a) a whole interface file
---              (b) a type (so that type sigs can be parsed lazily)
---              (c) the IdInfo part of a signature (same reason)
-
-iface_stuff :: { IfaceStuff }
-iface_stuff : iface            { PIface   $1 }
-           | type              { PType    $1 }
-           | id_info           { PIdInfo  $1 }
-           | rules_and_deprecs { PRulesAndDeprecs $1 }
-
 iface          :: { ParsedIface }
 iface          : '__interface' package mod_name 
                        version sub_versions
@@ -358,6 +350,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
@@ -369,7 +363,7 @@ maybe_idinfo  :: { RdrName -> [HsIdInfo RdrName] }
 maybe_idinfo  : {- empty -}    { \_ -> [] }
              | pragma          { \x -> if opt_IgnoreIfacePragmas then [] 
                                        else case $1 of
-                                               POk _ (PIdInfo id_info) -> id_info
+                                               POk _ id_info -> id_info
                                                PFailed err -> pprPanic "IdInfo parse failed" 
                                                                        (vcat [ppr x, err])
                                }
@@ -390,8 +384,8 @@ maybe_idinfo  : {- empty -}         { \_ -> [] }
        dates from a time where we picked up a .hi file first if it existed.]
     -}
 
-pragma :: { ParseResult IfaceStuff }
-pragma : src_loc PRAGMA        { parseIface $2 PState{ bol = 0#, atbol = 1#,
+pragma :: { ParseResult [HsIdInfo RdrName] }
+pragma : src_loc PRAGMA        { parseIdInfo $2 PState{ bol = 0#, atbol = 1#,
                                                        context = [],
                                                        glasgow_exts = 1#,
                                                        loc = $1 }
@@ -401,11 +395,18 @@ pragma    : src_loc PRAGMA        { parseIface $2 PState{ bol = 0#, atbol = 1#,
 
 rules_and_deprecs_part :: { ([RdrNameRuleDecl], IfaceDeprecs) }
 rules_and_deprecs_part : {- empty -}   { ([], Nothing) }
-                      | pragma         { case $1 of
-                                            POk _ (PRulesAndDeprecs rds) -> rds
+                      | rules_prag     { case $1 of
+                                            POk _ rds -> rds
                                             PFailed err -> pprPanic "Rules/Deprecations parse failed" err
                                        }
 
+rules_prag :: { ParseResult ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_prag : src_loc PRAGMA    { parseRules $2 PState{ bol = 0#, atbol = 1#,
+                                                       context = [],
+                                                       glasgow_exts = 1#,
+                                                       loc = $1 }
+                               }
+
 rules_and_deprecs :: { ([RdrNameRuleDecl], IfaceDeprecs) }
 rules_and_deprecs : rule_prag deprec_prag      { ($1, $2) }
 
@@ -421,8 +422,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 $1) }
 
 rule_forall    :: { [UfBinder RdrName] }
 rule_forall    : '__forall' '{' core_bndrs '}' { $3 }
@@ -477,9 +482,9 @@ constr              :  src_loc ex_stuff qdata_name batypes          { mk_con_decl $3 $2 (VanillaCon
                 -- We use "data_fs" so as to include ()
 
 newtype_constr :: { [RdrNameConDecl] {- Not allowed to be empty -} }
-newtype_constr : src_loc '=' ex_stuff qdata_name atype { [mk_con_decl $4 $3 (VanillaCon [Unbanged $5]) $1] }
+newtype_constr : src_loc '=' ex_stuff qdata_name atype { [mk_con_decl $4 $3 (VanillaCon [unbangedType $5]) $1] }
                | src_loc '=' ex_stuff qdata_name '{' qvar_name '::' atype '}'
-                                                       { [mk_con_decl $4 $3 (RecCon [([$6], Unbanged $8)]) $1] }
+                                                       { [mk_con_decl $4 $3 (RecCon [([$6], unbangedType $8)]) $1] }
 
 ex_stuff :: { ([HsTyVarBndr RdrName], RdrNameContext) }
 ex_stuff       :                                       { ([],[]) }
@@ -490,18 +495,18 @@ batypes           :                                       { [] }
                |  batype batypes                       { $1 : $2 }
 
 batype         :: { RdrNameBangType }
-batype         :  tatype                               { Unbanged $1 }
-               |  '!' tatype                           { Banged   $2 }
-               |  '!' '!' tatype                       { Unpacked $3 }
+batype         :  tatype                               { unbangedType $1 }
+               |  '!' tatype                           { BangType MarkedStrict    $2 }
+               |  '!' '!' tatype                       { BangType MarkedUnboxed   $3 }
 
 fields1                :: { [([RdrName], RdrNameBangType)] }
 fields1                : field                                 { [$1] }
                | field ',' fields1                     { $1 : $3 }
 
 field          :: { ([RdrName], RdrNameBangType) }
-field          :  qvar_names1 '::' ttype               { ($1, Unbanged $3) }
-               |  qvar_names1 '::' '!' ttype           { ($1, Banged   $4) }
-               |  qvar_names1 '::' '!' '!' ttype       { ($1, Unpacked $5) }
+field          :  qvar_names1 '::' ttype               { ($1, unbangedType $3) }
+               |  qvar_names1 '::' '!' ttype           { ($1, BangType MarkedStrict    $4) }
+               |  qvar_names1 '::' '!' '!' ttype       { ($1, BangType MarkedUnboxed   $5) }
 
 --------------------------------------------------------------------------
 
@@ -524,8 +529,8 @@ context_list1       : class                                 { [$1] }
                | class ',' context_list1               { $1 : $3 }
 
 class          :: { HsPred RdrName }
-class          :  qcls_name atypes                     { (HsPClass $1 $2) }
-               |  ipvar_name '::' type                 { (HsPIParam $1 $3) }
+class          :  qcls_name atypes                     { (HsClassP $1 $2) }
+               |  ipvar_name '::' type                 { (HsIParam $1 $3) }
 
 types0         :: { [RdrNameHsType]                    {- Zero or more -}  }   
 types0         :  {- empty -}                          { [ ] }
@@ -596,9 +601,8 @@ mod_name    :: { ModuleName }
 
 
 ---------------------------------------------------
-var_fs         :: { EncodedFS }
+var_fs          :: { EncodedFS }
                : VARID                 { $1 }
-               | '!'                   { SLIT("!") }
                | 'as'                  { SLIT("as") }
                | 'qualified'           { SLIT("qualified") }
                | 'hiding'              { SLIT("hiding") }
@@ -627,7 +631,7 @@ qvar_name   :  var_name             { $1 }
                |  qvar_fs              { mkIfaceOrig varName $1 }
 
 ipvar_name     :: { RdrName }
-               :  IPVARID              { mkRdrUnqual (mkSysOccFS ipName (tailFS $1)) }
+               :  IPVARID              { mkRdrUnqual (mkSysOccFS varName (tailFS $1)) }
 
 qvar_names1    :: { [RdrName] }
 qvar_names1    : qvar_name             { [$1] }
@@ -689,11 +693,11 @@ qcls_name :: { RdrName }
 
 ---------------------------------------------------
 tv_name                :: { RdrName }
-               :  VARID                { mkRdrUnqual (mkSysOccFS tvName $1) }
+               :  var_fs               { mkRdrUnqual (mkSysOccFS tvName $1) }
 
 tv_bndr                :: { HsTyVarBndr RdrName }
                :  tv_name '::' akind   { IfaceTyVar $1 $3 }
-               |  tv_name              { IfaceTyVar $1 boxedTypeKind }
+               |  tv_name              { IfaceTyVar $1 liftedTypeKind }
 
 tv_bndrs       :: { [HsTyVarBndr RdrName] }
                : tv_bndrs1             { $1 }
@@ -726,7 +730,7 @@ kind                :: { Kind }
 
 akind          :: { Kind }
                : VARSYM                { if $1 == SLIT("*") then
-                                               boxedTypeKind
+                                               liftedTypeKind
                                          else if $1 == SLIT("?") then
                                                openTypeKind
                                          else if $1 == SLIT("\36") then
@@ -742,24 +746,15 @@ id_info           :: { [HsIdInfo RdrName] }
                | id_info_item id_info          { $1 : $2 }
 
 id_info_item   :: { HsIdInfo RdrName }
-               : '__A' INTEGER                 { HsArity (exactArity (fromInteger $2)) }
+               : '__A' INTEGER                 { HsArity (fromInteger $2) }
                | '__U' inline_prag core_expr   { HsUnfold $2 $3 }
-               | '__M'                         { HsCprInfo }
-               | '__S'                         { HsStrictness (mkStrictnessInfo $1) }
+               | '__S'                         { HsStrictness $1 }
                | '__C'                         { HsNoCafRefs }
-               | '__P' qvar_name               { HsWorker $2 }
+               | '__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) }
+                :  {- empty -}                  { AlwaysActive }
+               | '[' INTEGER ']'               { ActiveAfter (fromInteger $2) }
 
 -------------------------------------------------------
 core_expr      :: { UfExpr RdrName }
@@ -807,12 +802,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
                           }
 
 
@@ -895,7 +891,7 @@ core_val_bndr       : var_name '::' atype                           { UfValBinder $1 $3 }
 
 core_tv_bndr   :: { UfBinder RdrName }
 core_tv_bndr   :  '@' tv_name '::' akind               { UfTyBinder $2 $4 }
-               |  '@' tv_name                          { UfTyBinder $2 boxedTypeKind }
+               |  '@' tv_name                          { UfTyBinder $2 liftedTypeKind }
 
 ccall_string   :: { FAST_STRING }
                : STRING                                        { $1 }
@@ -941,10 +937,5 @@ checkVersion :: { () }
 happyError :: P a
 happyError buf PState{ loc = loc } = PFailed (ifaceParseErr buf loc)
 
-data IfaceStuff = PIface          ParsedIface
-               | PIdInfo          [HsIdInfo RdrName]
-               | PType            RdrNameHsType
-               | PRulesAndDeprecs ([RdrNameRuleDecl], IfaceDeprecs)
-
 mk_con_decl name (ex_tvs, ex_ctxt) details loc = mkConDecl name ex_tvs ex_ctxt details loc
 }