
On Fri, 16 May 2008, Achim Schneider wrote:
Andrew Coppin
wrote: Wait... "unexpected end of input; expecting [...] end of input [...]"
That's just *wrong*...! ;-)
But don't despaire - show us your parser and what it's supposed to parse, and I'm sure somebody [maybe even me] will be able to tell you what's up.
This is what I came up with while simplifying the parser:
import Text.Parsec
identifier = do whiteSpace s <- many1 letter whiteSpace return s
whiteSpace = do eof <|> ((many $ choice [ char ' ', newline ]) >> return ())
main = do let syn = runParser (do char '\\' many1 identifier char ':' whiteSpace identifier whiteSpace ) () "" "\\a b" print syn
Admittedly, this is a quite degenerate case crouching in at least 10 corners simultaneously. Anyway, I get
% ./test Left (line 1, column 5): unexpected end of input expecting end of input, letter or ":"
Confusing, isn't it? It's almost the right message, too. I'm pretty sure the misbehaviour's because eof doesn't consume - see what happens if you put an error message on all of whiteSpace?
and if I change it to
whiteSpace = do (many eof >> return ()) <|> ((many $ choice [ char ' ', newline ]) >> return ())
Left (line 1, column 3): unexpected " " expecting letter, end of input or ":"
Which is broken for your purposes, but that's because many always succeeds so the changed whiteSpace doesn't actually eat whitespace.
Please, please don't ask me for the rationale of using eof like this, you would get the same answer as if you'd ask me why I cast a stone into the sea.
As a matter of general practice I'd suggest including eof exactly once, as in: topLevel = do {r <- realTopLevel; eof; return r} realTopLevel = ... Which isn't to say that you haven't run into something confusing and possibly broken here, of course. -- flippa@flippac.org "The reason for this is simple yet profound. Equations of the form x = x are completely useless. All interesting equations are of the form x = y." -- John C. Baez