ChrisK wrote:
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...

But hang on a minute...

"many" parses 0 or more occurrances of an item.

"sepBy" parses 0 or more occurrances of an item, seperated by another item.

"endBy" parses 0 or more occurrances of an item, terminated by another item.

"sepEndBy" parses 0 or more occurrances of an item, seperated *and* terminated by another item.

...except that "endBy" doesn't seem to be working right. :-S

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to