[project @ 2001-11-26 09:20:25 by simonpj]
[ghc-hetmet.git] / ghc / compiler / parser / Parser.y
index 9269c59..95c46a1 100644 (file)
@@ -1,6 +1,6 @@
 {-
 -----------------------------------------------------------------------------
-$Id: Parser.y,v 1.68 2001/06/13 15:50:57 rrt Exp $
+$Id: Parser.y,v 1.77 2001/11/26 09:20:26 simonpj Exp $
 
 Haskell grammar.
 
@@ -9,10 +9,11 @@ Author(s): Simon Marlow, Sven Panne 1997, 1998, 1999
 -}
 
 {
-module Parser ( parseModule, parseStmt ) where
+module Parser ( parseModule, parseStmt, parseIdentifier ) where
 
 import HsSyn
 import HsTypes         ( mkHsTupCon )
+import TypeRep          ( IPName(..) )
 
 import RdrHsSyn
 import Lex
@@ -27,14 +28,14 @@ import ForeignCall  ( Safety(..), CExportSpec(..), CCallSpec(..),
 import OccName         ( UserFS, varName, tcName, dataName, tcClsName, tvName )
 import SrcLoc          ( SrcLoc )
 import Module
-import Demand          ( StrictnessMark(..) )
 import CmdLineOpts     ( opt_SccProfilingOn )
-import BasicTypes      ( Boxity(..), Fixity(..), FixityDirection(..), NewOrData(..) )
+import BasicTypes      ( Boxity(..), Fixity(..), FixityDirection(..), 
+                         NewOrData(..), StrictnessMark(..), Activation(..) )
 import Panic
 
 import GlaExts
 import CStrings                ( CLabelString )
-import FastString      ( tailFS )
+import FastString
 import Maybes          ( orElse )
 import Outputable
 
@@ -146,7 +147,7 @@ Conflicts: 14 shift/reduce
  '__A'         { ITarity }
  '__P'         { ITspecialise }
  '__C'         { ITnocaf }
- '__U'         { ITunfold $$ }
+ '__U'         { ITunfold }
  '__S'         { ITstrict $$ }
  '__M'         { ITcprinfo $$ }
 -}
@@ -189,7 +190,8 @@ Conflicts: 14 shift/reduce
  QVARSYM       { ITqvarsym  $$ }
  QCONSYM       { ITqconsym  $$ }
 
- IPVARID       { ITipvarid  $$ }               -- GHC extension
+ IPDUPVARID    { ITdupipvarid   $$ }           -- GHC extension
+ IPSPLITVARID          { ITsplitipvarid $$ }           -- GHC extension
 
  CHAR          { ITchar     $$ }
  STRING                { ITstring   $$ }
@@ -207,6 +209,7 @@ Conflicts: 14 shift/reduce
 %lexer { lexer } { ITeof }
 %name parseModule module
 %name parseStmt   maybe_stmt
+%name parseIdentifier  identifier
 %tokentype { Token }
 %%
 
@@ -285,8 +288,8 @@ importdecls :: { [RdrNameImportDecl] }
        | {- empty -}                           { [] }
 
 importdecl :: { RdrNameImportDecl }
-       : 'import' srcloc maybe_src optqualified CONID maybeas maybeimpspec 
-               { ImportDecl (mkModuleNameFS $5) $3 $4 $6 $7 $2 }
+       : 'import' srcloc maybe_src optqualified modid maybeas maybeimpspec 
+               { ImportDecl $5 $3 $4 $6 $7 $2 }
 
 maybe_src :: { WhereFrom }
        : '{-# SOURCE' '#-}'                    { ImportByUserSource }
@@ -414,18 +417,14 @@ decls     :: { [RdrBinding] }
 decl   :: { RdrBinding }
        : fixdecl                       { $1 }
        | valdef                        { $1 }
-       | '{-# INLINE'   srcloc opt_phase qvar '#-}'     { RdrSig (InlineSig $4 $3 $2) }
-       | '{-# NOINLINE' srcloc opt_phase qvar '#-}'     { RdrSig (NoInlineSig $4 $3 $2) }
+       | '{-# INLINE'   srcloc activation qvar '#-}'         { RdrSig (InlineSig True  $4 $3 $2) }
+       | '{-# NOINLINE' srcloc inverse_activation qvar '#-}' { RdrSig (InlineSig False $4 $3 $2) }
        | '{-# SPECIALISE' srcloc qvar '::' sigtypes '#-}'
                { foldr1 RdrAndBindings 
                    (map (\t -> RdrSig (SpecSig $3 t $2)) $5) }
        | '{-# SPECIALISE' srcloc 'instance' inst_type '#-}'
                { RdrSig (SpecInstSig $4 $2) }
 
-opt_phase :: { Maybe Int }
-          : INTEGER                     { Just (fromInteger $1) }
-          | {- empty -}                 { Nothing }
-
 wherebinds :: { RdrNameHsBinds }
        : where                 { cvBinds cvValSig (groupBindings $1) }
 
@@ -456,8 +455,16 @@ rules      :: { RdrBinding }
        |  {- empty -}                          { RdrNullBind }
 
 rule   :: { RdrBinding }
-       : STRING rule_forall infixexp '=' srcloc exp
-            { RdrHsDecl (RuleD (HsRule $1 [] $2 $3 $6 $5)) }
+       : STRING activation rule_forall infixexp '=' srcloc exp
+            { RdrHsDecl (RuleD (HsRule $1 $2 $3 $4 $7 $6)) }
+
+activation :: { Activation }           -- Omitted means AlwaysActive
+        : {- empty -}                           { AlwaysActive }
+        | '[' INTEGER ']'                       { ActiveAfter (fromInteger $2) }
+
+inverse_activation :: { Activation }   -- Omitted means NeverActive
+        : {- empty -}                           { NeverActive }
+        | '[' INTEGER ']'                       { ActiveAfter (fromInteger $2) }
 
 rule_forall :: { [RdrNameRuleBndr] }
        : 'forall' rule_var_list '.'            { $2 }
@@ -500,6 +507,7 @@ unsafe_flag :: { Safety }
 
 ext_name :: { Maybe CLabelString }
        : STRING                { Just $1 }
+       | STRING STRING         { Just $2 }     -- Ignore "module name" for now
        | {- empty -}           { Nothing }
 
 
@@ -601,7 +609,7 @@ varids0     :: { [RdrName] }
 
 newconstr :: { RdrNameConDecl }
        : srcloc conid atype    { mkConDecl $2 [] [] (VanillaCon [unbangedType $3]) $1 }
-       | srcloc conid '{' var '::' type '}'
+       | srcloc conid '{' var '::' ctype '}'
                                { mkConDecl $2 [] [] (RecCon [([$4], unbangedType $6)]) $1 }
 
 constrs :: { [RdrNameConDecl] }
@@ -693,9 +701,8 @@ valdef :: { RdrBinding }
 
 
 rhs    :: { RdrNameGRHSs }
-       : '=' srcloc exp wherebinds     { (GRHSs (unguardedRHS $3 $2) 
-                                                               $4 Nothing)}
-       | gdrhs wherebinds              { GRHSs (reverse $1) $2 Nothing }
+       : '=' srcloc exp wherebinds     { (GRHSs (unguardedRHS $3 $2) $4 placeHolderType)}
+       | gdrhs wherebinds              { GRHSs (reverse $1) $2 placeHolderType }
 
 gdrhs :: { [RdrNameGRHS] }
        : gdrhs gdrh                    { $2 : $1 }
@@ -720,9 +727,9 @@ infixexp :: { RdrNameHsExpr }
 exp10 :: { RdrNameHsExpr }
        : '\\' srcloc aexp aexps opt_asig '->' srcloc exp       
                        {% checkPatterns $2 ($3 : reverse $4) `thenP` \ ps -> 
-                          returnP (HsLam (Match [] ps $5 
+                          returnP (HsLam (Match ps $5 
                                            (GRHSs (unguardedRHS $8 $7) 
-                                                  EmptyBinds Nothing))) }
+                                                  EmptyBinds placeHolderType))) }
        | 'let' declbinds 'in' exp              { HsLet $2 $4 }
        | 'if' srcloc exp 'then' exp 'else' exp { HsIf $3 $5 $7 $2 }
        | 'case' srcloc exp 'of' altslist       { HsCase $3 $5 $2 }
@@ -730,10 +737,10 @@ exp10 :: { RdrNameHsExpr }
        | srcloc 'do' stmtlist                  {% checkDo $3  `thenP` \ stmts ->
                                                   returnP (HsDo DoExpr stmts $1) }
 
-       | '_ccall_'    ccallid aexps0           { HsCCall $2 $3 PlayRisky False cbot }
-       | '_ccall_GC_' ccallid aexps0           { HsCCall $2 $3 PlaySafe  False cbot }
-       | '_casm_'     CLITLIT aexps0           { HsCCall $2 $3 PlayRisky True  cbot }
-       | '_casm_GC_'  CLITLIT aexps0           { HsCCall $2 $3 PlaySafe  True  cbot }
+       | '_ccall_'    ccallid aexps0           { HsCCall $2 $3 PlayRisky False placeHolderType }
+       | '_ccall_GC_' ccallid aexps0           { HsCCall $2 $3 PlaySafe  False placeHolderType }
+       | '_casm_'     CLITLIT aexps0           { HsCCall $2 $3 PlayRisky True  placeHolderType }
+       | '_casm_GC_'  CLITLIT aexps0           { HsCCall $2 $3 PlaySafe  True  placeHolderType }
 
         | scc_annot exp                                { if opt_SccProfilingOn
                                                        then HsSCC $1 $2
@@ -774,8 +781,8 @@ aexp1       :: { RdrNameHsExpr }
        : ipvar                         { HsIPVar $1 }
        | var_or_con                    { $1 }
        | literal                       { HsLit $1 }
-       | INTEGER                       { HsOverLit (HsIntegral   $1) }
-       | RATIONAL                      { HsOverLit (HsFractional $1) }
+       | INTEGER                       { HsOverLit (mkHsIntegral   $1) }
+       | RATIONAL                      { HsOverLit (mkHsFractional $1) }
        | '(' exp ')'                   { HsPar $2 }
        | '(' exp ',' texps ')'         { ExplicitTuple ($2 : reverse $4) Boxed}
        | '(#' texps '#)'               { ExplicitTuple (reverse $2)      Unboxed }
@@ -798,8 +805,8 @@ texps :: { [RdrNameHsExpr] }
 -- avoiding another shift/reduce-conflict.
 
 list :: { RdrNameHsExpr }
-       : exp                           { ExplicitList [$1] }
-       | lexps                         { ExplicitList (reverse $1) }
+       : exp                           { ExplicitList placeHolderType [$1] }
+       | lexps                         { ExplicitList placeHolderType (reverse $1) }
        | exp '..'                      { ArithSeqIn (From $1) }
        | exp ',' exp '..'              { ArithSeqIn (FromThen $1 $3) }
        | exp '..' exp                  { ArithSeqIn (FromTo $1 $3) }
@@ -847,8 +854,8 @@ alts1       :: { [RdrNameMatch] }
 alt    :: { RdrNameMatch }
        : srcloc infixexp opt_sig ralt wherebinds
                                        {% (checkPattern $1 $2 `thenP` \p ->
-                                          returnP (Match [] [p] $3
-                                                    (GRHSs $4 $5 Nothing))  )}
+                                          returnP (Match [p] $3
+                                                    (GRHSs $4 $5 placeHolderType))  )}
 
 ralt :: { [RdrNameGRHS] }
        : '->' srcloc exp               { [GRHS [ResultStmt $3 $2] $2] }
@@ -891,7 +898,7 @@ maybe_stmt :: { Maybe RdrNameStmt }
 stmt  :: { RdrNameStmt }
        : srcloc infixexp '<-' exp      {% checkPattern $1 $2 `thenP` \p ->
                                           returnP (BindStmt p $4 $1) }
-       | srcloc exp                    { ExprStmt $2 $1 }
+       | srcloc exp                    { ExprStmt $2 placeHolderType $1 }
        | srcloc 'let' declbinds        { LetStmt $3 }
 
 -----------------------------------------------------------------------------
@@ -909,22 +916,27 @@ fbind     :: { (RdrName, RdrNameHsExpr, Bool) }
 -----------------------------------------------------------------------------
 -- Implicit Parameter Bindings
 
-dbinding :: { [(RdrName, RdrNameHsExpr)] }
+dbinding :: { [(IPName RdrName, RdrNameHsExpr)] }
        : '{' dbinds '}'                { $2 }
        | layout_on dbinds close        { $2 }
 
-dbinds         :: { [(RdrName, RdrNameHsExpr)] }
+dbinds         :: { [(IPName RdrName, RdrNameHsExpr)] }
        : dbinds ';' dbind              { $3 : $1 }
        | dbinds ';'                    { $1 }
        | dbind                         { [$1] }
        | {- empty -}                   { [] }
 
-dbind  :: { (RdrName, RdrNameHsExpr) }
+dbind  :: { (IPName RdrName, RdrNameHsExpr) }
 dbind  : ipvar '=' exp                 { ($1, $3) }
 
 -----------------------------------------------------------------------------
 -- Variables, Constructors and Operators.
 
+identifier :: { RdrName }
+       : qvar                          { $1 }
+       | gcon                          { $1 }
+       | qop                           { $1 }
+
 depreclist :: { [RdrName] }
 depreclist : deprec_var                        { [$1] }
           | deprec_var ',' depreclist  { $1 : $3 }
@@ -959,8 +971,9 @@ qvar        :: { RdrName }
 -- whether it's a qvar or a var can be postponed until
 -- *after* we see the close paren.
 
-ipvar  :: { RdrName }
-       : IPVARID               { (mkUnqual varName (tailFS $1)) }
+ipvar  :: { IPName RdrName }
+       : IPDUPVARID            { Dupable   (mkUnqual varName $1) }
+       | IPSPLITVARID          { MustSplit (mkUnqual varName $1) }
 
 qcon   :: { RdrName }
        : qconid                { $1 }
@@ -1095,7 +1108,7 @@ literal :: { HsLit }
        | PRIMSTRING            { HsStringPrim $1 }
        | PRIMFLOAT             { HsFloatPrim  $1 }
        | PRIMDOUBLE            { HsDoublePrim $1 }
-       | CLITLIT               { HsLitLit     $1 (error "Parser.y: CLITLIT") }
+       | CLITLIT               { HsLitLit     $1 placeHolderType }
 
 srcloc :: { SrcLoc }   :       {% getSrcLocP }
  
@@ -1114,6 +1127,11 @@ layout_on_for_do  :: { () }      : {% layoutOn False }
 
 modid  :: { ModuleName }
        : CONID                 { mkModuleNameFS $1 }
+        | QCONID               { mkModuleNameFS
+                                  (mkFastString
+                                    (unpackFS (fst $1) ++ 
+                                       '.':unpackFS (snd $1)))
+                               }
 
 tycon  :: { RdrName }
        : CONID                 { mkUnqual tcClsName $1 }