+rules_and_deprecs_part :: { ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_and_deprecs_part : {- empty -} { ([], Nothing) }
+ | rules_prag { case $1 of
+ POk _ rds -> rds
+ PFailed err -> pprPanic "Rules/Deprecations parse failed" err
+ }
+
+rules_prag :: { ParseResult ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_prag : src_loc PRAGMA { parseRules $2 PState{ bol = 0#, atbol = 1#,
+ context = [],
+ glasgow_exts = 1#,
+ loc = $1 }
+ }
+
+rules_and_deprecs :: { ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_and_deprecs : rule_prag deprec_prag { ($1, $2) }
+
+
+-----------------------------------------------------------------------------
+
+rule_prag :: { [RdrNameRuleDecl] }
+rule_prag : {- empty -} { [] }
+ | '__R' rules { $2 }
+
+rules :: { [RdrNameRuleDecl] }
+ : {- empty -} { [] }
+ | rule ';' rules { $1:$3 }
+
+rule :: { RdrNameRuleDecl }
+rule : src_loc STRING activation rule_forall qvar_name
+ core_args '=' core_expr { IfaceRule $2 $3 $4 $5 $6 $8 $1 }
+
+activation :: { Activation }
+activation : {- empty -} { AlwaysActive }
+ | '[' INTEGER ']' { ActiveAfter (fromInteger $2) }
+
+rule_forall :: { [UfBinder RdrName] }
+rule_forall : '__forall' '{' core_bndrs '}' { $3 }
+
+-----------------------------------------------------------------------------
+
+deprec_prag :: { IfaceDeprecs }
+deprec_prag : {- empty -} { Nothing }
+ | '__D' deprecs { Just $2 }
+
+deprecs :: { Either DeprecTxt [(RdrName,DeprecTxt)] }
+deprecs : STRING { Left $1 }
+ | deprec_list { Right $1 }
+
+deprec_list :: { [(RdrName,DeprecTxt)] }
+deprec_list : deprec { [$1] }
+ | deprec ';' deprec_list { $1 : $3 }
+
+deprec :: { (RdrName,DeprecTxt) }
+deprec : deprec_name STRING { ($1, $2) }
+
+deprec_name :: { RdrName }
+ : qvar_name { $1 }
+ | qtc_name { $1 }
+
+-----------------------------------------------------------------------------
+