summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/parser/Parser.y39
1 files changed, 20 insertions, 19 deletions
diff --git a/compiler/parser/Parser.y b/compiler/parser/Parser.y
index bf62286705..80bc48daa8 100644
--- a/compiler/parser/Parser.y
+++ b/compiler/parser/Parser.y
@@ -860,29 +860,34 @@ role : VARID { sL1 $1 $ Just $ getVARID $1 }
-- Glasgow extension: pattern synonyms
pattern_synonym_decl :: { LHsDecl RdrName }
- : 'pattern' pat '=' pat
- {% do { (name, args) <- splitPatSyn $2
- ; return $ sLL $1 $> . ValD $ mkPatSynBind name args $4 ImplicitBidirectional
- }}
- | 'pattern' pat '<-' pat
- {% do { (name, args) <- splitPatSyn $2
- ; return $ sLL $1 $> . ValD $ mkPatSynBind name args $4 Unidirectional
- }}
- | 'pattern' pat '<-' pat where_decls
- {% do { (name, args) <- splitPatSyn $2
+ : 'pattern' pattern_synonym_lhs '=' pat
+ { let (name, args) = $2
+ in sLL $1 $> . ValD $ mkPatSynBind name args $4 ImplicitBidirectional }
+ | 'pattern' pattern_synonym_lhs '<-' pat
+ { let (name, args) = $2
+ in sLL $1 $> . ValD $ mkPatSynBind name args $4 Unidirectional }
+ | 'pattern' pattern_synonym_lhs '<-' pat where_decls
+ {% do { let (name, args) = $2
; mg <- toPatSynMatchGroup name $5
; return $ sLL $1 $> . ValD $
- mkPatSynBind name args $4 (ExplicitBidirectional mg)
- }}
+ mkPatSynBind name args $4 (ExplicitBidirectional mg) }}
+
+pattern_synonym_lhs :: { (Located RdrName, HsPatSynDetails (Located RdrName)) }
+ : con vars0 { ($1, PrefixPatSyn $2) }
+ | varid consym varid { ($2, InfixPatSyn $1 $3) }
+
+vars0 :: { [Located RdrName] }
+ : {- empty -} { [] }
+ | varid vars0 { $1 : $2 }
where_decls :: { Located (OrdList (LHsDecl RdrName)) }
: 'where' '{' decls '}' { $3 }
| 'where' vocurly decls close { $3 }
pattern_synonym_sig :: { LSig RdrName }
- : 'pattern' 'type' con '::' ptype
- { let (flag, qtvs, prov, req, ty) = unLoc $5
- in sLL $1 $> $ PatSynSig $3 (flag, mkHsQTvs qtvs) prov req ty }
+ : 'pattern' con '::' ptype
+ { let (flag, qtvs, prov, req, ty) = unLoc $4
+ in sLL $1 $> $ PatSynSig $2 (flag, mkHsQTvs qtvs) prov req ty }
ptype :: { Located (HsExplicitFlag, [LHsTyVarBndr RdrName], LHsContext RdrName, LHsContext RdrName, LHsType RdrName) }
: 'forall' tv_bndrs '.' ptype
@@ -895,10 +900,6 @@ ptype :: { Located (HsExplicitFlag, [LHsTyVarBndr RdrName], LHsContext RdrName,
pcontext :: { Located (LHsContext RdrName, LHsContext RdrName) }
: btype {% fmap (sL1 $1) $ checkContextPair $1 }
-vars0 :: { [Located RdrName] }
- : {- empty -} { [] }
- | varid vars0 { $1 : $2 }
-
-----------------------------------------------------------------------------
-- Nested declarations