[Haskell-cafe] Parsec Question

Daniel Fischer daniel.is.fischer at web.de
Mon Jan 9 10:21:52 EST 2006


Am Montag, 9. Januar 2006 12:52 schrieb Gerd M:
> I'm trying to use parsec for parsing a custom input stream. As far as I
> understood the manual correctly I need to define the primitive parser:
>
> type MyParser a   = GenParser (SourcePos,Tok) () a
> mytoken :: (Tok -> Maybe a) -> MyParser a
> mytoken test
>   = token showToken posToken testToken
>   where
>     showToken (pos,tok)   = show tok
>     posToken  (pos,tok)   = pos
>     testToken (pos,tok)   = test tok
>
> The problem is, since SourcePos is an abstract datatype, how can I actually
> run this parser without explicitly using values of type SourcePos in the
> input stream?
>
> Many thanks in advance!
>

I'm almost convinced, you don't really want to parse a list of (SourcePos,Tok) 
pairs. The SourcePos is taken care of in the internal state of the parsers. 
And maybe, you should use tokenPrim instead of token. Then you'd probably get 
something like

type MyParser a = GenParser Tok () a

mytoken :: (Tok -> Maybe a) -> MyParser a
mytoken test = tokenPrim show update test
               where
                 update pos tok toks = case tok of
                               NewL -> setSourceColumn (incSourceLine pos 1) 1
                               _    -> incSourceColumn pos 1

or whatever is an appropriate update function for the SourcePos. If Tok is 
Char, of course a wealth of parsers are already supplied.

HTH

Cheers,
Daniel


More information about the Haskell-Cafe mailing list