You can use 'notFollowedBy' (probably with 'many1' and 'try'). Something like (untested):
notFollowedBy (try $ string "//") Thu 2009/4/17 Michael Mossey <m...@alumni.caltech.edu>: > Here's what I've got so far. > > -- Text is considered everything up to //. However, the problem > -- is that this consumes the //. > parseText = manyTill anyChar (try (string "//")) > > -- Because the // is already consumed, parseKeyword just grabs > -- the available letters. > parseKeyword :: Parser String > parseKeyword = many1 letter > > > > > -- Test function. > parseSome = do t1 <- parseText > k1 <- parseKeyword > t2 <- parseText > return (t1,k1,t2) > > On "some text//keyword more text//" this gives > > ("some text","keyword"," more text") > > On "some text//keyword more text" > > this gives the error "expecting //" > > I wonder how I can get the manyTill to be happy with eof before finding the > //? I tried > > parseText = manyTill anyChar (try (string "//") <|> eof) > > but got a type error. > > > minh thu wrote: >> >> 2009/4/17 Michael P Mossey <m...@alumni.caltech.edu>: >>> >>> I want to write a parser that can read a file with this format: the file >>> has >>> sections which are demarcated by keywords. Keywords always begin with two >>> forward slashes and consist of letters, digits, and underscore. The text >>> can >>> be anything, including special characters. For instance: >>> >>> >>> //keyword some text >>> and more text //another_keyword and) some { more text >>> //ya_keyword $$ >>> -- text >>> >>> >>> I'm not sure how to write a parser that considers anything but a double >>> slash to be a valid part of the text. >> >> Maybe you can use a combination of 'many', 'noneOf' or 'manyTill' ? >> >> Cheers, >> Thu > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe