[Haskell-cafe] Parsec question
minh thu
noteed at gmail.com
Fri Apr 17 04:06:10 EDT 2009
You can use 'notFollowedBy' (probably with 'many1' and 'try').
Something like (untested):
notFollowedBy (try $ string "//")
Thu
2009/4/17 Michael Mossey <mpm at 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 <mpm at 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list