+inst_decl :: { RdrNameInstDecl }
+inst_decl : src_loc 'instance' type '=' var_name ';'
+ { InstDecl $3
+ EmptyMonoBinds {- No bindings -}
+ [] {- No user pragmas -}
+ $5 {- Dfun id -}
+ $1
+ }
+
+--------------------------------------------------------------------------
+
+decls_part :: { [(Version, RdrNameHsDecl)] }
+decls_part
+ : {- empty -} { [] }
+ | decls_part version decl ';' { ($2,$3):$1 }
+
+decl :: { RdrNameHsDecl }
+decl : src_loc var_name '::' type maybe_idinfo
+ { SigD (IfaceSig $2 $4 ($5 $2) $1) }
+ | src_loc 'type' tc_name tv_bndrs '=' type
+ { TyClD (TySynonym $3 $4 $6 $1) }
+ | src_loc 'data' decl_context tc_name tv_bndrs constrs
+ { TyClD (TyData DataType $3 $4 $5 $6 Nothing noDataPragmas $1) }
+ | src_loc 'newtype' decl_context tc_name tv_bndrs newtype_constr
+ { TyClD (TyData NewType $3 $4 $5 $6 Nothing noDataPragmas $1) }
+ | src_loc 'class' decl_context tc_name tv_bndrs fds csigs
+ { TyClD (mkClassDecl $3 $4 $5 $6 $7 EmptyMonoBinds
+ noClassPragmas $1) }
+ | src_loc fixity mb_fix var_or_data_name
+ { FixD (FixitySig $4 (Fixity $3 $2) $1) }
+
+maybe_idinfo :: { RdrName -> [HsIdInfo RdrName] }
+maybe_idinfo : {- empty -} { \_ -> [] }
+ | pragma { \x -> case $1 of
+ POk _ (PIdInfo id_info) -> id_info
+ PFailed err ->
+ pprPanic "IdInfo parse failed"
+ (vcat [ppr x, err])
+ }
+
+pragma :: { ParseResult IfaceStuff }
+pragma : src_loc PRAGMA { parseIface $2 PState{ bol = 0#, atbol = 1#,
+ context = [],
+ glasgow_exts = 1#,
+ loc = $1 }
+ }
+
+-----------------------------------------------------------------------------
+
+rules_and_deprecs :: { ([RdrNameRuleDecl], [RdrNameDeprecation]) }
+rules_and_deprecs : {- empty -} { ([], []) }
+ | rules_and_deprecs rule_or_deprec
+ { let
+ append2 (xs1,ys1) (xs2,ys2) =
+ (xs1 `app` xs2, ys1 `app` ys2)
+ xs `app` [] = xs -- performance paranoia
+ xs `app` ys = xs ++ ys
+ in append2 $1 $2
+ }
+
+rule_or_deprec :: { ([RdrNameRuleDecl], [RdrNameDeprecation]) }
+rule_or_deprec : pragma { case $1 of
+ POk _ (PRules rules) -> (rules,[])
+ POk _ (PDeprecs deprecs) -> ([],deprecs)
+ PFailed err -> pprPanic "Rules/Deprecations parse failed" err
+ }
+
+-----------------------------------------------------------------------------
+
+rules :: { [RdrNameRuleDecl] }
+ : {- empty -} { [] }
+ | rule ';' rules { $1:$3 }
+
+rule :: { RdrNameRuleDecl }
+rule : src_loc STRING rule_forall qvar_name
+ core_args '=' core_expr { IfaceRuleDecl $4 (UfRuleBody $2 $3 $5 $7) $1 }
+
+rule_forall :: { [UfBinder RdrName] }
+rule_forall : '__forall' '{' core_bndrs '}' { $3 }
+
+-----------------------------------------------------------------------------
+
+deprecs :: { [RdrNameDeprecation] }
+deprecs : {- empty -} { [] }
+ | deprecs deprec ';' { $2 : $1 }
+
+deprec :: { RdrNameDeprecation }
+deprec : STRING { Deprecation (IEModuleContents undefined) $1 }
+ | deprec_name STRING { Deprecation $1 $2 }
+
+-- SUP: TEMPORARY HACK
+deprec_name :: { RdrNameIE }
+ : var_name { IEVar $1 }
+
+-----------------------------------------------------------------------------