
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...