{-
-----------------------------------------------------------------------------
-$Id: Parser.y,v 1.7 1999/06/25 14:38:54 simonmar Exp $
+$Id: Parser.y,v 1.12 1999/07/27 07:31:18 simonpj Exp $
Haskell grammar.
[ RdrSig (Sig n $4 $2) | n <- $1 ] }
sigtype :: { RdrNameHsType }
- : ctype { case $1 of
- HsForAllTy _ _ _ -> $1
- other -> HsForAllTy Nothing [] $1 }
+ : ctype { mkHsForAllTy Nothing [] $1 }
{-
ATTENTION: Dirty Hackery Ahead! If the second alternative of vars is var
ctype :: { RdrNameHsType }
: 'forall' tyvars '.' context type
- { HsForAllTy (Just $2) $4 $5 }
- | 'forall' tyvars '.' type { HsForAllTy (Just $2) [] $4 }
- | context type { HsForAllTy Nothing $1 $2 }
+ { mkHsForAllTy (Just $2) $4 $5 }
+ | 'forall' tyvars '.' type { mkHsForAllTy (Just $2) [] $4 }
+ | context type { mkHsForAllTy Nothing $1 $2 }
+ -- A type of form (context => type) is an *implicit* HsForAllTy
| type { $1 }
types0 :: { [RdrNameHsType] }
-- Statement sequences
stmtlist :: { [RdrNameStmt] }
- : '{' stmts '}' { reverse $2 }
- | layout_on stmts close { reverse $2 }
+ : '{' stmts '}' { $2 }
+ | layout_on_for_do stmts close { $2 }
+-- Stmt list must end in an expression
+-- thought the H98 report doesn't currently say so in the syntax
stmts :: { [RdrNameStmt] }
- : ';' stmts1 { $2 }
- | stmts1 { $1 }
+ : stmts1 srcloc exp { reverse (ExprStmt $3 $2 : $1) }
+-- A list of zero or more stmts, ending in semicolon
+-- Returned in *reverse* order
stmts1 :: { [RdrNameStmt] }
- : stmts1 ';' stmt { $3 : $1 }
- | stmts1 ';' { $1 }
- | stmt { [$1] }
+ : stmts1 stmt ';' { $2 : $1 }
+ | stmts1 ';' { $1 }
+ | { [] }
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)