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