What do you mean by "doesn't work"?  Crashes? Fails to build with some error?  
Builds but doesn't parse what you expect?

In the latter case, what happened to the shift/reduce and reduce/reduce errors 
reported by Happy?  Esp the latter.  If you are getting more you need to track 
them down.

For exmape if I see
        pattern P ...
and I've gotten to the P.  Have I seen an empty forall, and this is the 
beginning of context, or have I seen an empty patsyn_context, and this is the 
beginning of constr_stuff.  I think this'll be a reduce/reduce error.

I think it may be helped by

patsyn_contxt :: forall | forall context '=>'

c.f the defn of 'constr'.  

IN haste

Simoin

| -----Original Message-----
| From: ghc-devs [mailto:[email protected]] On Behalf Of Dr.
| ERDI Gergo
| Sent: 24 June 2014 13:12
| To: GHC Devs
| Subject: Help needed: parsing pattern synonym contexts
| 
| Hi,
| 
| I'm working on adding type signatures to pattern synonyms. The syntax
| I'm after would look something like, e.g.:
| 
| pattern (Eq b) => P Int (Bool, b) (f [a]) :: (Show a) => Maybe [a]
| 
| My problem is with parsing the two contexts. I wrote the parser in the
| following way, which I felt natural (actions omitted for brevity)
| 
| pattern_synonym_sig :: { LSig RdrName }
|          : 'pattern' patsyn_context patsyn_stuff '::' patsyn_context
| type
| 
| patsyn_stuff :: { Located (Located RdrName, HsPatSynDetails (LHsType
| RdrName)) }
|          : constr_stuff
| 
| patsyn_context :: { LHsContext RdrName }
|          : {- empty -}
|          | forall context '=>'
| 
| However, this doesn't work, no matter if those contexts are present or
| not. If I remove both contexts from the rules, i.e. if I replace
| pattern_synonym_sig with
| 
|          : 'pattern' patsyn_stuff '::' type
| 
| then parsing succeeds when there are no contexts on either side. I've
| also tried
| 
|          : 'pattern' patsyn_stuff '::' ctype
| 
| with the intention of recovering the required context from the ctype
| (and I could do similar tricks to get the provided context from the
| patsyn_stuff by using a modified version of constr_stuff); however, even
| that doesn't work as I expected it, i.e. with this latter version, this:
| 
| pattern Single a :: (Eq a) => [a]
| 
| fails with a parse error on "::".
| 
| Can someone help me out here please?
| 
| Thanks,
|       Gergo
| _______________________________________________
| ghc-devs mailing list
| [email protected]
| http://www.haskell.org/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to