{- -*-haskell-*-
-----------------------------------------------------------------------------
-$Id: Parser.y,v 1.105 2002/09/27 08:20:45 simonpj Exp $
+$Id: Parser.y,v 1.120 2003/06/24 07:58:22 simonpj Exp $
Haskell grammar.
import HsTypes ( mkHsTupCon )
import RdrHsSyn
-import HscTypes ( ParsedIface(..), IsBootInterface )
+import HscTypes ( ParsedIface(..), IsBootInterface, noDependencies )
import Lex
-import ParseUtil
import RdrName
import PrelNames ( mAIN_Name, funTyConName, listTyConName,
- parrTyConName, consDataConName, nilDataConName )
-import TysWiredIn ( unitTyCon, unitDataCon, tupleTyCon, tupleCon )
+ parrTyConName, consDataConName )
+import TysWiredIn ( unitTyCon, unitDataCon, tupleTyCon, tupleCon, nilDataCon )
import ForeignCall ( Safety(..), CExportSpec(..),
CCallConv(..), CCallTarget(..), defaultCCallConv,
)
import OccName ( UserFS, varName, tcName, dataName, tcClsName, tvName )
import TyCon ( DataConDetails(..) )
+import DataCon ( DataCon, dataConName )
import SrcLoc ( SrcLoc )
import Module
import CmdLineOpts ( opt_SccProfilingOn, opt_InPackage )
'stdcall' { ITstdcallconv }
'ccall' { ITccallconv }
'dotnet' { ITdotnet }
+ 'proc' { ITproc } -- for arrow notation extension
+ 'rec' { ITrec } -- for arrow notation extension
'_ccall_' { ITccall (False, False, PlayRisky) }
'_ccall_GC_' { ITccall (False, False, PlaySafe False) }
'_casm_' { ITccall (False, True, PlayRisky) }
'{-# INLINE' { ITinline_prag }
'{-# NOINLINE' { ITnoinline_prag }
'{-# RULES' { ITrules_prag }
+ '{-# CORE' { ITcore_prag } -- hdaume: annotated core
'{-# SCC' { ITscc_prag }
'{-# DEPRECATED' { ITdeprecated_prag }
'#-}' { ITclose_prag }
'-' { ITminus }
'!' { ITbang }
'*' { ITstar }
+ '-<' { ITlarrowtail } -- for arrow notation
+ '>-' { ITrarrowtail } -- for arrow notation
+ '-<<' { ITLarrowtail } -- for arrow notation
+ '>>-' { ITRarrowtail } -- for arrow notation
'.' { ITdot }
'{' { ITocurly } -- special symbols
')' { ITcparen }
'(#' { IToubxparen }
'#)' { ITcubxparen }
+ '(|' { IToparenbar }
+ '|)' { ITcparenbar }
';' { ITsemi }
',' { ITcomma }
'`' { ITbackquote }
'[t|' { ITopenTypQuote }
'[d|' { ITopenDecQuote }
'|]' { ITcloseQuote }
-ID_SPLICE { ITidEscape $$ } -- $x
-'$(' { ITparenEscape } -- $( exp )
+ID_SPLICE { ITidEscape $$ } -- $x
+'$(' { ITparenEscape } -- $( exp )
+REIFY_TYPE { ITreifyType }
+REIFY_DECL { ITreifyDecl }
+REIFY_FIXITY { ITreifyFixity }
%monad { P } { thenP } { returnP }
%lexer { lexer } { ITeof }
module :: { RdrNameHsModule }
: srcloc 'module' modid maybemoddeprec maybeexports 'where' body
- { HsModule (mkHomeModule $3) Nothing $5 (fst $7) (snd $7) $4 $1 }
+ { HsModule (Just (mkHomeModule $3)) $5 (fst $7) (snd $7) $4 $1 }
| srcloc body
- { HsModule (mkHomeModule mAIN_Name) Nothing Nothing
- (fst $2) (snd $2) Nothing $1 }
+ { HsModule Nothing Nothing (fst $2) (snd $2) Nothing $1 }
maybemoddeprec :: { Maybe DeprecTxt }
: '{-# DEPRECATED' STRING '#-}' { Just $2 }
| cvtopdecls { ([],$1) }
cvtopdecls :: { [RdrNameHsDecl] }
- : topdecls { cvTopDecls (groupBindings $1)}
+ : topdecls { cvTopDecls $1 }
-----------------------------------------------------------------------------
-- Interfaces (.hi-boot files)
pi_vers = 1, -- Module version
pi_orphan = False,
pi_exports = (1,[($2,mkIfaceExports $4)]),
+ pi_deps = noDependencies,
pi_usages = [],
pi_fixity = [],
pi_insts = [],
| layout_on ifacedecls close { $2 }
ifacedecls :: { [RdrNameTyClDecl] }
- : ifacedecl ';' ifacedecls { $1 : $3 }
- | ';' ifacedecls { $2 }
- | ifacedecl { [$1] }
- | {- empty -} { [] }
+ : ifacedecl ';' ifacedecls { $1 : $3 }
+ | ';' ifacedecls { $2 }
+ | ifacedecl { [$1] }
+ | {- empty -} { [] }
ifacedecl :: { RdrNameTyClDecl }
- : srcloc 'data' tycl_hdr constrs
- { mkTyData DataType $3 (DataCons (reverse $4)) Nothing $1 }
-
- | srcloc 'newtype' tycl_hdr '=' newconstr
- { mkTyData NewType $3 (DataCons [$5]) Nothing $1 }
-
- | srcloc 'class' tycl_hdr fds where
- { let
- (binds,sigs) = cvMonoBindsAndSigs cvClassOpSig
- (groupBindings $5)
- in
- mkClassDecl $3 $4 sigs (Just binds) $1 }
-
- | srcloc 'type' tycon tv_bndrs '=' ctype
- { TySynonym $3 $4 $6 $1 }
-
- | srcloc var '::' sigtype
- { IfaceSig $2 $4 [] $1 }
+ : tycl_decl { $1 }
+ | srcloc var '::' sigtype { IfaceSig $2 $4 [] $1 }
-----------------------------------------------------------------------------
-- The Export List
prec :: { Int }
: {- empty -} { 9 }
- | INTEGER {% checkPrec $1 `thenP_`
- returnP (fromInteger $1) }
+ | INTEGER {% checkPrecP (fromInteger $1) }
infix :: { FixityDirection }
: 'infix' { InfixN }
-----------------------------------------------------------------------------
-- Top-Level Declarations
-topdecls :: { [RdrBinding] }
- : topdecls ';' topdecl { ($3 : $1) }
+topdecls :: { [RdrBinding] } -- Reversed
+ : topdecls ';' topdecl { $3 : $1 }
| topdecls ';' { $1 }
| topdecl { [$1] }
topdecl :: { RdrBinding }
+ : tycl_decl { RdrHsDecl (TyClD $1) }
+ | srcloc 'instance' inst_type where
+ { let (binds,sigs) = cvMonoBindsAndSigs $4
+ in RdrHsDecl (InstD (InstDecl $3 binds sigs Nothing $1)) }
+ | srcloc 'default' '(' comma_types0 ')' { RdrHsDecl (DefD (DefaultDecl $4 $1)) }
+ | 'foreign' fdecl { RdrHsDecl $2 }
+ | '{-# DEPRECATED' deprecations '#-}' { RdrBindings (reverse $2) }
+ | '{-# RULES' rules '#-}' { RdrBindings (reverse $2) }
+ | srcloc '$(' exp ')' { RdrHsDecl (SpliceD (SpliceDecl $3 $1)) }
+ | decl { $1 }
+
+tycl_decl :: { RdrNameTyClDecl }
: srcloc 'type' syn_hdr '=' ctype
-- Note ctype, not sigtype.
-- We allow an explicit for-all but we don't insert one
-- in type Foo a = (b,b)
-- Instead we just say b is out of scope
- { let (tc,tvs) = $3
- in RdrHsDecl (TyClD (TySynonym tc tvs $5 $1)) }
+ { let (tc,tvs) = $3 in TySynonym tc tvs $5 $1 }
| srcloc 'data' tycl_hdr constrs deriving
- {% returnP (RdrHsDecl (TyClD
- (mkTyData DataType $3 (DataCons (reverse $4)) $5 $1))) }
+ { mkTyData DataType $3 (DataCons (reverse $4)) $5 $1 }
| srcloc 'newtype' tycl_hdr '=' newconstr deriving
- {% returnP (RdrHsDecl (TyClD
- (mkTyData NewType $3 (DataCons [$5]) $6 $1))) }
+ { mkTyData NewType $3 (DataCons [$5]) $6 $1 }
| srcloc 'class' tycl_hdr fds where
- {% let
- (binds,sigs) = cvMonoBindsAndSigs cvClassOpSig (groupBindings $5)
- in
- returnP (RdrHsDecl (TyClD
- (mkClassDecl $3 $4 sigs (Just binds) $1))) }
-
- | srcloc 'instance' inst_type where
- { let (binds,sigs)
- = cvMonoBindsAndSigs cvInstDeclSig
- (groupBindings $4)
- in RdrHsDecl (InstD (InstDecl $3 binds sigs Nothing $1)) }
-
- | srcloc 'default' '(' comma_types0 ')' { RdrHsDecl (DefD (DefaultDecl $4 $1)) }
- | 'foreign' fdecl { RdrHsDecl $2 }
- | '{-# DEPRECATED' deprecations '#-}' { $2 }
- | '{-# RULES' rules '#-}' { $2 }
- | '$(' exp ')' { RdrHsDecl (SpliceD $2) }
- | decl { $1 }
+ { let
+ (binds,sigs) = cvMonoBindsAndSigs $5
+ in
+ mkClassDecl $3 $4 sigs (Just binds) $1 }
syn_hdr :: { (RdrName, [RdrNameHsTyVar]) } -- We don't retain the syntax of an infix
-- type synonym declaration. Oh well.
| type {% checkTyClHdr $1 `thenP` \ (tc,tvs) ->
returnP ([], tc, tvs) }
-{-
- : '(' comma_types1 ')' '=>' gtycon tv_bndrs
- {% mapP checkPred $2 `thenP` \ cxt ->
- returnP (cxt, $5, $6) }
-
- | '(' ')' '=>' gtycon tv_bndrs
- { ([], $4, $5) }
-
- -- qtycon for the class below name would lead to many s/r conflicts
- -- FIXME: does the renamer pick up all wrong forms and raise an
- -- error
- | gtycon atypes1 '=>' gtycon atypes0
- {% checkTyVars $5 `thenP` \ tvs ->
- returnP ([HsClassP $1 $2], $4, tvs) }
-
- | gtycon atypes0
- {% checkTyVars $2 `thenP` \ tvs ->
- returnP ([], $1, tvs) }
- -- We have to have qtycon in this production to avoid s/r
- -- conflicts with the previous one. The renamer will complain
- -- if we use a qualified tycon.
- --
- -- Using a `gtycon' throughout. This enables special syntax,
- -- such as "[]" for tycons as well as tycon ops in
- -- parentheses. This is beyond H98, but used repeatedly in
- -- the Prelude modules. (So, it would be a good idea to raise
- -- an error in the renamer if some non-H98 form is used and
- -- -fglasgow-exts is not given.) -=chak
-
-atypes0 :: { [RdrNameHsType] }
- : atypes1 { $1 }
- | {- empty -} { [] }
-
-atypes1 :: { [RdrNameHsType] }
- : atype { [$1] }
- | atype atypes1 { $1 : $2 }
--}
+-----------------------------------------------------------------------------
+-- Nested declarations
-decls :: { [RdrBinding] }
+decls :: { [RdrBinding] } -- Reversed
: decls ';' decl { $3 : $1 }
| decls ';' { $1 }
| decl { [$1] }
| {- empty -} { [] }
-decl :: { RdrBinding }
- : fixdecl { $1 }
- | valdef { $1 }
- | '{-# 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) }
-wherebinds :: { RdrNameHsBinds }
- : where { cvBinds cvValSig (groupBindings $1) }
+decllist :: { [RdrBinding] } -- Reversed
+ : '{' decls '}' { $2 }
+ | layout_on decls close { $2 }
-where :: { [RdrBinding] }
+where :: { [RdrBinding] } -- Reversed
+ -- No implicit parameters
: 'where' decllist { $2 }
| {- empty -} { [] }
-declbinds :: { RdrNameHsBinds }
- : decllist { cvBinds cvValSig (groupBindings $1) }
+binds :: { RdrNameHsBinds } -- May have implicit parameters
+ : decllist { cvBinds $1 }
+ | '{' dbinds '}' { IPBinds $2 False{-not with-} }
+ | layout_on dbinds close { IPBinds $2 False{-not with-} }
-decllist :: { [RdrBinding] }
- : '{' decls '}' { $2 }
- | layout_on decls close { $2 }
+wherebinds :: { RdrNameHsBinds } -- May have implicit parameters
+ : 'where' binds { $2 }
+ | {- empty -} { EmptyBinds }
-letbinds :: { RdrNameHsExpr -> RdrNameHsExpr }
- : decllist { HsLet (cvBinds cvValSig (groupBindings $1)) }
- | '{' dbinds '}' { \e -> HsWith e $2 False{-not with-} }
- | layout_on dbinds close { \e -> HsWith e $2 False{-not with-} }
-fixdecl :: { RdrBinding }
- : srcloc infix prec ops { foldr1 RdrAndBindings
- [ RdrSig (FixSig (FixitySig n
- (Fixity $3 $2) $1))
- | n <- $4 ] }
-----------------------------------------------------------------------------
-- Transformation Rules
-rules :: { RdrBinding }
- : rules ';' rule { $1 `RdrAndBindings` $3 }
+rules :: { [RdrBinding] } -- Reversed
+ : rules ';' rule { $3 : $1 }
| rules ';' { $1 }
- | rule { $1 }
- | {- empty -} { RdrNullBind }
+ | rule { [$1] }
+ | {- empty -} { [] }
rule :: { RdrBinding }
: STRING activation rule_forall infixexp '=' srcloc exp
| '(' varid '::' ctype ')' { RuleBndrSig $2 $4 }
-----------------------------------------------------------------------------
--- Deprecations
+-- Deprecations (c.f. rules)
-deprecations :: { RdrBinding }
- : deprecations ';' deprecation { $1 `RdrAndBindings` $3 }
- | deprecations ';' { $1 }
- | deprecation { $1 }
- | {- empty -} { RdrNullBind }
+deprecations :: { [RdrBinding] } -- Reversed
+ : deprecations ';' deprecation { $3 : $1 }
+ | deprecations ';' { $1 }
+ | deprecation { [$1] }
+ | {- empty -} { [] }
-- SUP: TEMPORARY HACK, not checking for `module Foo'
deprecation :: { RdrBinding }
: srcloc depreclist STRING
- { foldr RdrAndBindings RdrNullBind
+ { RdrBindings
[ RdrHsDecl (DeprecD (Deprecation n $3 $1)) | n <- $2 ] }
We can't tell whether to reduce var to qvar until after we've read the signatures.
-}
-valdef :: { RdrBinding }
- : infixexp srcloc opt_sig rhs {% (checkValDef $1 $3 $4 $2) }
- | infixexp srcloc '::' sigtype {% (checkValSig $1 $4 $2) }
- | var ',' sig_vars srcloc '::' sigtype { foldr1 RdrAndBindings
- [ RdrSig (Sig n $6 $4) | n <- $1:$3 ]
- }
+decl :: { RdrBinding }
+ : sigdecl { $1 }
+ | infixexp srcloc opt_sig rhs {% checkValDef $1 $3 $4 $2 }
rhs :: { RdrNameGRHSs }
- : '=' srcloc exp wherebinds { (GRHSs (unguardedRHS $3 $2) $4 placeHolderType)}
- | gdrhs wherebinds { GRHSs (reverse $1) $2 placeHolderType }
+ : '=' srcloc exp wherebinds { GRHSs (unguardedRHS $3 $2) $4 placeHolderType }
+ | gdrhs wherebinds { GRHSs (reverse $1) $2 placeHolderType }
gdrhs :: { [RdrNameGRHS] }
: gdrhs gdrh { $2 : $1 }
gdrh :: { RdrNameGRHS }
: '|' srcloc quals '=' exp { GRHS (reverse (ResultStmt $5 $2 : $3)) $2 }
+sigdecl :: { RdrBinding }
+ : infixexp srcloc '::' sigtype
+ {% checkValSig $1 $4 $2 }
+ -- See the above notes for why we need infixexp here
+ | var ',' sig_vars srcloc '::' sigtype
+ { mkSigDecls [ Sig n $6 $4 | n <- $1:$3 ] }
+ | srcloc infix prec ops { mkSigDecls [ FixSig (FixitySig n (Fixity $3 $2) $1)
+ | n <- $4 ] }
+ | '{-# INLINE' srcloc activation qvar '#-}'
+ { RdrHsDecl (SigD (InlineSig True $4 $3 $2)) }
+ | '{-# NOINLINE' srcloc inverse_activation qvar '#-}'
+ { RdrHsDecl (SigD (InlineSig False $4 $3 $2)) }
+ | '{-# SPECIALISE' srcloc qvar '::' sigtypes '#-}'
+ { mkSigDecls [ SpecSig $3 t $2 | t <- $5] }
+ | '{-# SPECIALISE' srcloc 'instance' inst_type '#-}'
+ { RdrHsDecl (SigD (SpecInstSig $4 $2)) }
+
-----------------------------------------------------------------------------
-- Expressions
exp :: { RdrNameHsExpr }
- : infixexp '::' sigtype { (ExprWithTySig $1 $3) }
- | infixexp 'with' dbinding { HsWith $1 $3 True{-not a let-} }
+ : infixexp '::' sigtype { ExprWithTySig $1 $3 }
+ | infixexp 'with' dbinding { HsLet (IPBinds $3 True{-not a let-}) $1 }
+ | fexp srcloc '-<' exp { HsArrApp $1 $4 placeHolderType HsFirstOrderApp True $2 }
+ | fexp srcloc '>-' exp { HsArrApp $4 $1 placeHolderType HsFirstOrderApp False $2 }
+ | fexp srcloc '-<<' exp { HsArrApp $1 $4 placeHolderType HsHigherOrderApp True $2 }
+ | fexp srcloc '>>-' exp { HsArrApp $4 $1 placeHolderType HsHigherOrderApp False $2 }
| infixexp { $1 }
infixexp :: { RdrNameHsExpr }
returnP (HsLam (Match ps $5
(GRHSs (unguardedRHS $8 $7)
EmptyBinds placeHolderType))) }
- | 'let' letbinds 'in' exp { $2 $4 }
+ | 'let' binds '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 }
| '-' fexp { mkHsNegApp $2 }
then HsSCC $1 $2
else HsPar $2 }
+ | 'proc' srcloc aexp '->' srcloc exp
+ {% checkPattern $2 $3 `thenP` \ p ->
+ returnP (HsProc p (HsCmdTop $6 [] placeHolderType undefined) $5) }
+
+ | srcloc operator cmdargs { HsArrForm $2 Nothing (reverse $3) $1 }
+
+ | '{-# CORE' STRING '#-}' exp { HsCoreAnn $2 $4 } -- hdaume: core annotation
+
+ | reifyexp { HsReify $1 }
| fexp { $1 }
scc_annot :: { FastString }
: fexp aexp { (HsApp $1 $2) }
| aexp { $1 }
+reifyexp :: { HsReify RdrName }
+ : REIFY_DECL gtycon { Reify ReifyDecl $2 }
+ | REIFY_DECL qvar { Reify ReifyDecl $2 }
+ | REIFY_TYPE qcname { Reify ReifyType $2 }
+ | REIFY_FIXITY qcname { Reify ReifyFixity $2 }
+
aexps0 :: { [RdrNameHsExpr] }
: aexps { reverse $1 }
| '_' { EWildPat }
-- MetaHaskell Extension
- | ID_SPLICE { mkHsSplice (HsVar (mkUnqual varName $1))} -- $x
- | '$(' exp ')' { mkHsSplice $2 } -- $( exp )
- | '[|' exp '|]' { HsBracket (ExpBr $2) }
- | '[t|' ctype '|]' { HsBracket (TypBr $2) }
- | '[p|' srcloc infixexp '|]' {% checkPattern $2 $3 `thenP` \p ->
- returnP (HsBracket (PatBr p)) }
- | '[d|' cvtopdecls '|]' { HsBracket (DecBr $2) }
+ | srcloc ID_SPLICE { mkHsSplice (HsVar (mkUnqual varName $2)) $1 } -- $x
+ | srcloc '$(' exp ')' { mkHsSplice $3 $1 } -- $( exp )
+ | srcloc '[|' exp '|]' { HsBracket (ExpBr $3) $1 }
+ | srcloc '[t|' ctype '|]' { HsBracket (TypBr $3) $1 }
+ | srcloc '[p|' infixexp '|]' {% checkPattern $1 $3 `thenP` \p ->
+ returnP (HsBracket (PatBr p) $1) }
+ | srcloc '[d|' cvtopbody '|]' { HsBracket (DecBr (mkGroup $3)) $1 }
+
+cmdargs :: { [RdrNameHsCmdTop] }
+ : cmdargs acmd { HsCmdTop $2 [] placeHolderType undefined : $1 }
+ | {- empty -} { [] }
+acmd :: { RdrNameHsExpr }
+ : '(' exp ')' { HsPar $2 }
+ | srcloc operator { HsArrForm $2 Nothing [] $1 }
+
+operator :: { RdrNameHsExpr }
+ : '(|' exp '|)' { $2 }
+
+cvtopbody :: { [RdrNameHsDecl] }
+ : '{' cvtopdecls '}' { $2 }
+ | layout_on cvtopdecls close { $2 }
texps :: { [RdrNameHsExpr] }
: texps ',' exp { $3 : $1 }
| exp ',' exp '..' { ArithSeqIn (FromThen $1 $3) }
| exp '..' exp { ArithSeqIn (FromTo $1 $3) }
| exp ',' exp '..' exp { ArithSeqIn (FromThenTo $1 $3 $5) }
- | exp srcloc pquals {% let { body [qs] = qs;
- body qss = [ParStmt (map reverse qss)] }
- in
- returnP ( mkHsDo ListComp
- (reverse (ResultStmt $1 $2 : body $3))
- $2
- )
+ | exp srcloc pquals { mkHsDo ListComp
+ (reverse (ResultStmt $1 $2 : $3))
+ $2
}
lexps :: { [RdrNameHsExpr] }
-----------------------------------------------------------------------------
-- List Comprehensions
-pquals :: { [[RdrNameStmt]] }
- : pquals '|' quals { $3 : $1 }
+pquals :: { [RdrNameStmt] } -- Either a singleton ParStmt, or a reversed list of Stmts
+ : pquals1 { case $1 of
+ [qs] -> qs
+ qss -> [ParStmt stmtss]
+ where
+ stmtss = [ (reverse qs, undefined)
+ | qs <- qss ]
+ }
+
+pquals1 :: { [[RdrNameStmt]] }
+ : pquals1 '|' quals { $3 : $1 }
| '|' quals { [$2] }
quals :: { [RdrNameStmt] }
(reverse $1) }
| exp '..' exp { PArrSeqIn (FromTo $1 $3) }
| exp ',' exp '..' exp { PArrSeqIn (FromThenTo $1 $3 $5) }
- | exp srcloc pquals {% let {
- body [qs] = qs;
- body qss = [ParStmt
- (map reverse qss)]}
- in
- returnP $
- mkHsDo PArrComp
- (reverse (ResultStmt $1 $2
- : body $3))
- $2
+ | exp srcloc pquals { mkHsDo PArrComp
+ (reverse (ResultStmt $1 $2 : $3))
+ $2
}
-- We are reusing `lexps' and `pquals' from the list case.
: srcloc infixexp '<-' exp {% checkPattern $1 $2 `thenP` \p ->
returnP (BindStmt p $4 $1) }
| srcloc exp { ExprStmt $2 placeHolderType $1 }
- | srcloc 'let' declbinds { LetStmt $3 }
+ | srcloc 'let' binds { LetStmt $3 }
+ | srcloc 'rec' stmtlist { RecStmt $3 undefined undefined undefined }
-----------------------------------------------------------------------------
-- Record Field Update/Construction
| tycon { $1 }
gcon :: { RdrName } -- Data constructor namespace
- : sysdcon { $1 }
+ : sysdcon { nameRdrName (dataConName $1) }
| qcon { $1 }
-- the case of '[:' ':]' is part of the production `parr'
-sysdcon :: { RdrName } -- Data constructor namespace
- : '(' ')' { getRdrName unitDataCon }
- | '(' commas ')' { getRdrName (tupleCon Boxed $2) }
- | '[' ']' { nameRdrName nilDataConName }
+sysdcon :: { DataCon } -- Wired in data constructors
+ : '(' ')' { unitDataCon }
+ | '(' commas ')' { tupleCon Boxed $2 }
+ | '[' ']' { nilDataCon }
var :: { RdrName }
: varid { $1 }
consym :: { RdrName }
: CONSYM { mkUnqual dataName $1 }
- | ':' { nameRdrName consDataConName }
+
-- ':' means only list cons
+ | ':' { nameRdrName consDataConName }
+ -- NB: SrcName because we are reading source
-----------------------------------------------------------------------------