parsinghaskellparsec

Why does Parsec stop parsing with multiple parser?


I'm trying to write a simple parser in Haskell using Parsec but my input "Hello World" is never correctly parsed.

My code looks like this:

parser = p1 <|> p2

p1 = string "Hello"
p2 = string "Hello World"

If I run it I get the error unexpected whitespace


Solution

  • p1 already consumes the tokens "Hello" and therefore p2 instantly fails because the next token is whitespace.

    You could use something like try to reset the consumed tokens.

    parser = try p1 <|> p2
    
    p1 = string "Hello"
    p2 = string "Hello World"