<div dir="ltr">If don't have to use Parsec, you can use a parser library like ReadP / ReadS.<div><br></div><div>For example:</div><div><br></div><div><div><font face="courier new, monospace">import Text.ParserCombinators.ReadP</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">abc =  (choice [ string "a", string "ab" ] ) >> char 'c' >> eof</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">run p s = case (readP_to_S p) s of</font></div><div><font face="courier new, monospace">            []         -> Left "no parse"</font></div><div><font face="courier new, monospace">            ((a,_):_)  -> Right a</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">test1 = run abc "ac"</font></div><div><font face="courier new, monospace">test2 = run abc "abc"</font></div><div><font face="courier new, monospace">test3 = run abc "ab"  -- should fail</font></div><div><br></div></div><div><br><div>On Monday, May 30, 2016 at 1:15:25 PM UTC-5, Petr Sokolov wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr">For example this parser doesn't parse "abc"<br><br>test :: Parser String<br>test = ((try $ string "a") <|> (string "ab")) *> (string "c")<br><br>I can rewrite it so it would parse "abc", but is there any general approach to force parser to return and try other branches?<br><br>(try a <|> b) *> c<br><br>Something like<br><br>(tryOtherBranchesIfFail (try a <|> b)) *> c<br><br>So if it cannot parse "abc" with (try a *> c) it could return and try (b *> c)<br>Or it isn't possible?<br><br></div></blockquote></div></div></div>