parsec: parserFail & multiple error messages

I am trying to create a parsec parser that parses an integer and then checks if that integer has the right size. If not, it generates an error. I tried the following: 8<--------------------------------------------------------------- import Text.Parsec import Text.Parsec.String integer :: Parser Int integer = do s <- many1 digit let n = read s if n > 65535 then parserFail "integer overflow" else return n 8<--------------------------------------------------------------- The problem is that when I try this parse integer "" "70000" I get the following error: Left (line 1, column 6): unexpected end of input expecting digit integer overflow ie there are three error messages but I only want the last one. Is there something I can do about this?

I found a similar question asked in June 2009 on the haskell-beginners archives, titled "Clearing Parsec error messages." A hack that was proposed (http://www.haskell.org/pipermail/beginners/2009-June/001809.html) was to insert a dummy character into the stream, consume it, and then fail. Still, I'd like to see if there is a cleaner way to modify the error state in the Parsec monad. NIck On Wednesday, August 08, 2012 03:24:31 PM silly8888 wrote:
I am trying to create a parsec parser that parses an integer and then checks if that integer has the right size. If not, it generates an error. I tried the following:
8<--------------------------------------------------------------- import Text.Parsec import Text.Parsec.String
integer :: Parser Int integer = do s <- many1 digit let n = read s if n > 65535 then parserFail "integer overflow" else return n 8<---------------------------------------------------------------
The problem is that when I try this
parse integer "" "70000"
I get the following error:
Left (line 1, column 6): unexpected end of input expecting digit integer overflow
ie there are three error messages but I only want the last one. Is there something I can do about this?
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Inserting a character into the stream can be expensive if for example
the stream is a ByteString.
I tried the following crazy solution and it seems that it works:
succeed :: Parser ()
succeed = mkPT $ \st ->
return $ Consumed $ return $ Ok () st $ unknownError st
succeed is a parser that always succeeds without really consuming any
input but it also resets the error state.
I really have no understating of how mkPT works. Can someone tell me
if this is a bad idea?
On Wed, Aug 8, 2012 at 4:09 PM, Nick Vanderweit
I found a similar question asked in June 2009 on the haskell-beginners archives, titled "Clearing Parsec error messages." A hack that was proposed (http://www.haskell.org/pipermail/beginners/2009-June/001809.html) was to insert a dummy character into the stream, consume it, and then fail. Still, I'd like to see if there is a cleaner way to modify the error state in the Parsec monad.
NIck
On Wednesday, August 08, 2012 03:24:31 PM silly8888 wrote:
I am trying to create a parsec parser that parses an integer and then checks if that integer has the right size. If not, it generates an error. I tried the following:
8<--------------------------------------------------------------- import Text.Parsec import Text.Parsec.String
integer :: Parser Int integer = do s <- many1 digit let n = read s if n > 65535 then parserFail "integer overflow" else return n 8<---------------------------------------------------------------
The problem is that when I try this
parse integer "" "70000"
I get the following error:
Left (line 1, column 6): unexpected end of input expecting digit integer overflow
ie there are three error messages but I only want the last one. Is there something I can do about this?
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

On Wed, Aug 8, 2012 at 8:26 PM, silly8888
Inserting a character into the stream can be expensive if for example the stream is a ByteString. I tried the following crazy solution and it seems that it works:
succeed :: Parser () succeed = mkPT $ \st -> return $ Consumed $ return $ Ok () st $ unknownError st
succeed is a parser that always succeeds without really consuming any input but it also resets the error state.
Because you're using the 'Consumed' constructor, you're also telling parsec not the back-track if there any errors following this parsers. This means that 'succeed >> failingParser' won't backtrack, even if 'failingParser' doesn't consume input. Are you using your original parser within a larger parser? Are the error messages also not great? Antoine

The error message can be improved in your examples by using "count 5" instead of "many1". C. Am 08.08.2012 21:24, schrieb silly8888:
I am trying to create a parsec parser that parses an integer and then checks if that integer has the right size. If not, it generates an error. I tried the following:
8<--------------------------------------------------------------- import Text.Parsec import Text.Parsec.String
integer :: Parser Int integer = do s <- many1 digit let n = read s if n > 65535 then parserFail "integer overflow" else return n 8<---------------------------------------------------------------
The problem is that when I try this
parse integer "" "70000"
I get the following error:
Left (line 1, column 6): unexpected end of input expecting digit integer overflow
ie there are three error messages but I only want the last one. Is there something I can do about this?

On 12-08-08 03:24 PM, silly8888 wrote:
The problem is that when I try this
parse integer "" "70000"
I get the following error:
Left (line 1, column 6): unexpected end of input expecting digit integer overflow
ie there are three error messages but I only want the last one. Is there something I can do about this?
import Text.Parsec import Text.Parsec.String integer :: Parser Int integer = try integ3r > "number at most 65535" integ3r = do s <- many1 digit let n = read s if n > 65535 then unexpected "number overflow" else return n main = do parseTest integer "a70000" parseTest integer "70000"
participants (5)
-
Albert Y. C. Lai
-
Antoine Latter
-
Christian Maeder
-
Nick Vanderweit
-
silly8888