I am using Parsec as my parsing library and quite liking it: though, I am unsure on how to properly tackle a 'free element' problem. Let me explain: In my file, there are some elements which look like this: this is some <red - formatted> text. I call this a FormatString. They can be found inside many elements, like: [ someconditions | this is some <red - formatted> text.] + this is some <red - formatted> text. -> somenumberhere To parse a FormatString I call 'generalText', which looks like this: 56 -- TEXT -- 57 58 generalText = many anyText >>= \fss -> 59 return (foldl (+:+%) (toFString "" []) fss) 60 61 anyText = try ( formattedText ) 62 <|> plainText 63 64 formattedText = char '<' >> 65 sepEndBy1 format spacebar >>= \fs -> -- format parser 66 string "- " >> 67 manyTill anyChar (char '>') >>= \cs -> 68 return (toFString cs fs) 69 70 plainText = many1 (noneOf "<") >>= \xs -> 71 return (toFString xs []) It works, but causes quite some headaches in using it: - I would like to call a "read with generalText until you find a ']' character. - or a "read with generalText until you find a " -> " (do not consume it) And the like, but I do not know how. If it were a plain string I would call manyTill1 anyChar myP. I thought of first parsing a raw string searching for a terminator and then feeding it to generalText. But isn't that cluncky codewise? Thanks for your help -F