Added parsing rule for BangPattern in case expr
[ghc-hetmet.git] / compiler / parser / Parser.y.pp
index 3bb5ab4..898d45c 100644 (file)
@@ -342,10 +342,13 @@ maybeexports :: { Maybe [LIE RdrName] }
        :  '(' exportlist ')'                   { Just $2 }
        |  {- empty -}                          { Nothing }
 
-exportlist :: { [LIE RdrName] }
-       :  exportlist ',' export                { $3 : $1 }
-       |  exportlist ','                       { $1 }
-       |  export                               { [$1]  }
+exportlist  :: { [LIE RdrName] }
+       : ','                                   { [] }
+       | exportlist1                           { $1 }
+
+exportlist1 :: { [LIE RdrName] }
+       :  export                               { [$1] }
+       |  export ',' exportlist                { $1 : $3 }
        |  {- empty -}                          { [] }
 
    -- No longer allow things like [] and (,,,) to be exported
@@ -399,8 +402,8 @@ maybeimpspec :: { Located (Maybe (Bool, [LIE RdrName])) }
        | {- empty -}                           { noLoc Nothing }
 
 impspec :: { Located (Bool, [LIE RdrName]) }
-       :  '(' exportlist ')'                   { LL (False, reverse $2) }
-       |  'hiding' '(' exportlist ')'          { LL (True,  reverse $3) }
+       :  '(' exportlist ')'                   { LL (False, $2) }
+       |  'hiding' '(' exportlist ')'          { LL (True,  $3) }
 
 -----------------------------------------------------------------------------
 -- Fixity Declarations
@@ -750,7 +753,7 @@ gadt_constr :: { LConDecl RdrName }
               { LL (mkGadtDecl $1 $3) } 
         -- Syntax: Maybe merge the record stuff with the single-case above?
         --         (to kill the mostly harmless reduce/reduce error)
-        -- XXX revisit autrijus
+        -- XXX revisit audreyt
        | constr_stuff_record '::' sigtype
                { let (con,details) = unLoc $1 in 
                  LL (ConDecl con Implicit [] (noLoc []) details (ResTyGADT $3)) }
@@ -1101,6 +1104,8 @@ alts1     :: { Located [LMatch RdrName] }
 alt    :: { LMatch RdrName }
        : infixexp opt_sig alt_rhs      {%  checkPattern $1 >>= \p ->
                                            return (LL (Match [p] $2 (unLoc $3))) }
+       | '!' infixexp opt_sig alt_rhs  {%  checkPattern $2 >>= \p ->
+                                           return (LL (Match [LL $ BangPat p] $3 (unLoc $4))) }
 
 alt_rhs :: { Located (GRHSs RdrName) }
        : ralt wherebinds               { LL (GRHSs (unLoc $1) (unLoc $2)) }