Andrew Coppin wrote: > Anybody want to explain to me why this doesn't work? > > ___ ___ _ > / _ \ /\ /\/ __(_) > / /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98. > / /_\\/ __ / /___| | http://www.haskell.org/ghc/ > \____/\/ /_/\____/|_| Type :? for help. > > Loading package base ... linking ... done. > Prelude> :m Text.ParserCombinators.Parsec > Prelude Text.ParserCombinators.Parsec> parseTest (endBy anyToken (char > '#')) "abc#" > Loading package parsec-2.0 ... linking ... done. > parse error at (line 1, column 1): > unexpected "b" > expecting "#"
anyToken is singular: it accepts a single token, in this case 'a'. Then endBy expects (char '#') to match and reads 'b' instead and gives the error message. So using (many anyToken) gets further: > Prelude Text.ParserCombinators.Parsec> parseTest (endBy (many anyToken) (char > '#')) "abc#" > Loading package parsec-2.0 ... linking ... done. > parse error at (line 1, column 1): > unexpected end of input > expecting "#" > Prelude Text.ParserCombinators.Parsec> parseTe Here (many anyToken) reads all of "abc#" and then endBy wants to read (char '#') and get the end of input instead. So the working version of endBy is thus: > Prelude Text.ParserCombinators.Parsec> parseTest (endBy (many (noneOf "#")) > (char '#')) "abc#" > ["abc"] Or you may need to not use endBy... _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe