Am Montag, 21. November 2005 03:27 schrieb Sara Kenedy: May I suggest
endBy anyToken semi ? -- optionally replace semi by "char ';'", if you don't want to skip whitespace I think this is what you want --- stop at the first semicolon. If you want to ignore just a final semicolon, you might use endBy anyToken (optional semi >> eof), if you want to stop at the last semicolon, whatever comes thereafter, you have a problem, you'd need long lookahead. Cheers, Daniel > Thanks for your solution. However, when I try this, > > > str1 :: Parser String > > str1 = do str <- many anyToken > > notFollowedBy' semi > > return str > > > > notFollowedBy' :: Show a => GenParser tok st a -> GenParser tok st () > > notFollowedBy' p = try $ join $ do a <- try p > > return > > (unexpected (show a)) <|> > > return (return ()) > > run:: Show a => Parser a -> String -> IO() > > > > run p input > > > > = case (parse p "" input) of > > > > Left err -> do {putStr "parse error at " ;print err} > > > > Right x -> print > > When I compile, it still displays ";" at the end of the string. > > Parser> run str1 "Hello ;" > "Hello ;" > > The reason, as I think, because anyToken accepts any kind of token, it > considers ";" as token of its string. Thus, it does not understand > notFollowedBy' ??? > > Do you have any ideas about this ??? Thanks. > > On 11/19/05, Andrew Pimlott <[EMAIL PROTECTED]> wrote: > > On Sat, Nov 19, 2005 at 06:43:48PM -0500, Sara Kenedy wrote: > > > str1 :: Parser String > > > str1 = do {str <- many anyToken; notFollowedBy semi; return str} > > > > > > However, when I compile, there is an error. > > > > > > ERROR "Test.hs":17 - Type error in application > > > *** Expression : notFollowedBy semi > > > *** Term : semi > > > *** Type : GenParser Char () String > > > *** Does not match : GenParser [Char] () [Char] > > > > The problem is that notFollowedBy has type > > > > notFollowedBy :: Show tok => GenParser tok st tok -> GenParser tok > > st () > > > > ie, the result type of the parser you pass to notFollowedBy has to be > > the same as the token type, in this case Char. (The reason for this > > type is obscure.) But semi has result type String. You could fix the > > type error by returning a dummy Char: > > > > str1 = do {str <- many anyToken > > ; notFollowedBy (semi >> return undefined) > > ; return str} > > > > I think this will even work; however notFollowedBy is a pretty > > squirrelly function. There was a discussion about it: > > > > http://www.haskell.org/pipermail/haskell/2004-February/013621.html > > > > Here is a version (which came out of that thread) with a nicer type, > > that probably also works more reliably (though I won't guarantee it): > > > > notFollowedBy' :: Show a => GenParser tok st a -> GenParser tok st () > > notFollowedBy' p = try $ join $ do a <- try p > > return (unexpected (show a)) > > <|> > > return (return ()) > > > > Andrew > > _______________________________________________ > 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