
Hello Haskellers, As an experiment I'm writing a parser for MediaWiki language. I'm using the Alex lexer and Parsec. I have novice two questions. (I've tried using Happy but I was unable to get a grammar file to compile, which must be because I have no real experience using Yacc and the like. I've also attempted to write an ad-hoc recursive descent parser, but that become too complex to be fun very quickly.) == SourcePos and AlexPosn == My first question is about Parsec's SourcePos. I have a definition like: type LexToken = (AlexPosn, Token) type MWP a = GenParser LexToken () a toSourcePos :: AlexPosn -> SourcePos toSourcePos (AlexPn _ line col) = undefined mwtok :: (Token -> Maybe a) -> MWP a mwtok test = token showToken posToken posTest where showToken = show . snd posToken = toSourcePos . fst posTest = test . snd The definition of toSourcePos isn't 100% satisfactory. The constructor SourcePos is hidden, so I cannot simply use (SourcePos line col). Is there a way to convert an AlexPosn value to a SourcePos? == Data Constructors as Parameters and Tags == Secondly, I frequently encounter the pattern where I try to match a token, return Just some result if it matches, and Nothing otherwise. So I tried to fix this pattern in a nice reusable function. onTok0 :: Token -> a -> MWP a onTok0 t x = mwtok (\tok -> if tok `isTok` t then Just x else Nothing) This seems to work, but I'd also like a definition for data constructors taking one parameter: onTok1 :: (a -> Token) -> (a -> b) -> MWP b onTok1 t f = mwtok (\tok -> case tok of (t n) = Just $ f n _ = Nothing) This doesn't work, the pattern match (t n) fails, which is understandable: n is used as a parameter to t and a matched result, which looks like a paradox. t is a function (constructor) but also a tag. Is it possible to pass a tag as an argument? Or is there another way to extract this pattern? Regards, Niels