{-
-----------------------------------------------------------------------------
-$Id: Parser.y,v 1.4 1999/06/02 16:05:56 simonmar Exp $
+$Id: Parser.y,v 1.10 1999/06/30 11:29:53 simonmar Exp $
Haskell grammar.
: ctype {% checkInstType $1 }
ctype :: { RdrNameHsType }
- : 'forall' tyvars '.' btype '=>' type
- {% checkContext $4 `thenP` \c ->
- returnP (HsForAllTy (Just $2) c $6) }
+ : 'forall' tyvars '.' context type
+ { HsForAllTy (Just $2) $4 $5 }
| 'forall' tyvars '.' type { HsForAllTy (Just $2) [] $4 }
- | btype '=>' type {% checkContext $1 `thenP` \c ->
- returnP (HsForAllTy Nothing c $3) }
+ | context type { HsForAllTy Nothing $1 $2 }
| type { $1 }
types0 :: { [RdrNameHsType] }
: constrs '|' constr { $3 : $1 }
| constr { [$1] }
-{- ToDo: existential stuff -}
-
constr :: { RdrNameConDecl }
- : srcloc scontype
- { ConDecl (fst $2) [] [] (VanillaCon (snd $2)) $1 }
- | srcloc sbtype conop sbtype
- { ConDecl $3 [] [] (InfixCon $2 $4) $1 }
- | srcloc con '{' fielddecls '}'
- { ConDecl $2 [] [] (RecCon (reverse $4)) $1 }
+ : srcloc forall context constr_stuff
+ { ConDecl (fst $4) $2 $3 (snd $4) $1 }
+ | srcloc forall constr_stuff
+ { ConDecl (fst $3) $2 [] (snd $3) $1 }
+
+forall :: { [RdrNameHsTyVar] }
+ : 'forall' tyvars '.' { $2 }
+ | {- empty -} { [] }
+
+context :: { RdrNameContext }
+ : btype '=>' {% checkContext $1 }
+
+constr_stuff :: { (RdrName, RdrNameConDetails) }
+ : scontype { (fst $1, VanillaCon (snd $1)) }
+ | sbtype conop sbtype { ($2, InfixCon $1 $3) }
+ | con '{' fielddecls '}' { ($1, RecCon (reverse $3)) }
newconstr :: { RdrNameConDecl }
: srcloc conid atype { ConDecl $2 [] [] (NewCon $3 Nothing) $1 }
| '_scc_' STRING exp { if opt_SccProfilingOn
then HsSCC $2 $3
- else $3 }
+ else HsPar $3 }
| fexp { $1 }
-- Statement sequences
stmtlist :: { [RdrNameStmt] }
- : '{' stmts '}' { reverse $2 }
- | layout_on stmts close { reverse $2 }
+ : '{' stmts '}' { reverse $2 }
+ | layout_on_for_do stmts close { reverse $2 }
stmts :: { [RdrNameStmt] }
- : stmts ';' stmt { $3 : $1 }
- | stmts ';' { $1 }
+ : ';' stmts1 { $2 }
+ | stmts1 { $1 }
+
+stmts1 :: { [RdrNameStmt] }
+ : stmts1 ';' stmt { $3 : $1 }
+ | stmts1 ';' { $1 }
| stmt { [$1] }
- | {- empty -} { [] }
stmt :: { RdrNameStmt }
: srcloc infixexp '<-' exp {% checkPattern $2 `thenP` \p ->
: vccurly { () } -- context popped in lexer.
| error {% popContext }
-layout_on :: { () } : {% layoutOn }
+layout_on :: { () } : {% layoutOn True{-strict-} }
+layout_on_for_do :: { () } : {% layoutOn False }
-----------------------------------------------------------------------------
-- Miscellaneous (mostly renamings)