16 May 22:25
Re: Re: Proving my point
From: Philippa Cowderoy <flippa <at> flippac.org>
Subject: Re: Re: Proving my point
Newsgroups: gmane.comp.lang.haskell.cafe
Date: 2008-05-16 20:25:01 GMT
Subject: Re: Re: Proving my point
Newsgroups: gmane.comp.lang.haskell.cafe
Date: 2008-05-16 20:25:01 GMT
On Fri, 16 May 2008, Achim Schneider wrote: > Andrew Coppin <andrewcoppin <at> btinternet.com> 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 <at> 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
> >
> > 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.
RSS Feed