+-- 'pat' recognises a pattern, including one with a bang at the top
+-- e.g. "!x" or "!(x,y)" or "C a b" etc
+-- Bangs inside are parsed as infix operator applications, so that
+-- we parse them right when bang-patterns are off
+pat :: { LPat RdrName }
+pat : exp {% checkPattern $1 }
+ | '!' aexp {% checkPattern (LL (SectionR (L1 (HsVar bang_RDR)) $2)) }
+
+apat :: { LPat RdrName }
+apat : aexp {% checkPattern $1 }
+ | '!' aexp {% checkPattern (LL (SectionR (L1 (HsVar bang_RDR)) $2)) }
+
+apats :: { [LPat RdrName] }
+ : apat apats { $1 : $2 }
+ | {- empty -} { [] }
+