
On Tue, Sep 05, 2006 at 04:17:41PM +0200,
Stephane Bortzmeyer
I'm trying to use Parsec for a language which have identifiers where the '-' character is allowed only inside identifiers, not at the start or the end.
[My grammar was underspecified, I also want to disallow two consecutive dashes.] Many thanks to Malcolm Wallace, Chris Kuklewicz and Udo Stenzel for their help and ideas. It seems there is no solution for ParsecToken (so I have to drop it). Among the two solutions which work for me (Malcolm Wallace's and Udo Stenzel's), I choosed the one by Udo because it is the one I understand the best. Here is my final version (rewritten in my style, errors are mine and not Udo's), thanks again: import Text.ParserCombinators.Parsec hiding (spaces) spaces = many1 (char ' ') inner_minus = do char '-' lookAhead alphaNum return '-' identifier = do start <- letter rest <- many (alphaNum <|> try inner_minus) return (start:rest) > "identifier" identifiers = do result <- identifier `sepBy` spaces eof return result main = do -- Legal parseTest identifiers "foo bar" parseTest identifiers "foo-bar baz go-to" parseTest identifiers "a b3 c56 e56-y7 gag-3456" -- Illegal parseTest identifiers "1llegal" parseTest identifiers "illegal- more" parseTest identifiers "ill--egal more" parseTest identifiers "illegal -more"