{-
-----------------------------------------------------------------------------
-$Id: Parser.y,v 1.8 1999/06/28 15:42:33 simonmar Exp $
+<<<<<<< Parser.y
+$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $
+=======
+$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $
+>>>>>>> 1.10
Haskell grammar.
%token
'_' { ITunderscore } -- Haskell keywords
+ 'as' { ITas }
'case' { ITcase }
'class' { ITclass }
'data' { ITdata }
'deriving' { ITderiving }
'do' { ITdo }
'else' { ITelse }
+ 'hiding' { IThiding }
'if' { ITif }
'import' { ITimport }
'in' { ITin }
'module' { ITmodule }
'newtype' { ITnewtype }
'of' { ITof }
+ 'qualified' { ITqualified }
'then' { ITthen }
'type' { ITtype }
'where' { ITwhere }
[ 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 '}' { reverse $2 }
+ | layout_on_for_do stmts close { reverse $2 }
+
+-- Stmt list should really end in an expression, but it's not
+-- convenient to enforce this here, so we throw out erroneous
+-- statement sequences in the renamer instead.
stmts :: { [RdrNameStmt] }
: ';' stmts1 { $2 }
varid :: { RdrName }
: VARID { mkSrcUnqual varName $1 }
+ | 'as' { as_var_RDR }
+ | 'qualified' { qualified_var_RDR }
+ | 'hiding' { hiding_var_RDR }
| 'forall' { forall_var_RDR }
| 'export' { export_var_RDR }
| 'label' { label_var_RDR }
varid_no_unsafe :: { RdrName }
: VARID { mkSrcUnqual varName $1 }
+ | 'as' { as_var_RDR }
+ | 'qualified' { qualified_var_RDR }
+ | 'hiding' { hiding_var_RDR }
| 'forall' { forall_var_RDR }
| 'export' { export_var_RDR }
| 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR }
--- ``special'' Ids
-'as' :: { () } : VARID {% checkAs $1 }
-'qualified' :: { () } : VARID {% checkQualified $1 }
-'hiding' :: { () } : VARID {% checkHiding $1 }
-
-----------------------------------------------------------------------------
-- ConIds
: vccurly { () } -- context popped in lexer.
| error {% popContext }
-layout_on :: { () } : {% layoutOn }
+layout_on :: { () } : {% layoutOn True{-strict-} }
+layout_on_for_do :: { () } : {% layoutOn False }
-----------------------------------------------------------------------------
-- Miscellaneous (mostly renamings)
tyvar :: { RdrName }
: VARID { mkSrcUnqual tvName $1 }
+ | 'as' { as_tyvar_RDR }
+ | 'qualified' { qualified_tyvar_RDR }
+ | 'hiding' { hiding_tyvar_RDR }
| 'export' { export_var_RDR }
| 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR }