<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"><meta http-equiv="Content-Type" content="text/html charset=utf-8"><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">Op 31 mei 2016, om 3:52  heeft Erik Rantapaa <<a href="mailto:erantapaa@gmail.com" class="">erantapaa@gmail.com</a>> het volgende geschreven:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">If don't have to use Parsec, you can use a parser library like ReadP / ReadS.<div class=""><br class=""></div><div class="">For example:</div><div class=""><br class=""></div><div class=""><div class=""><font face="courier new, monospace" class="">import Text.ParserCombinators.ReadP</font></div><div class=""><font face="courier new, monospace" class=""><br class=""></font></div><div class=""><font face="courier new, monospace" class="">abc =  (choice [ string "a", string "ab" ] ) >> char 'c' >> eof</font></div><div class=""><font face="courier new, monospace" class=""><br class=""></font></div><div class=""><font face="courier new, monospace" class="">run p s = case (readP_to_S p) s of</font></div><div class=""><font face="courier new, monospace" class="">            []         -> Left "no parse"</font></div><div class=""><font face="courier new, monospace" class="">            ((a,_):_)  -> Right a</font></div><div class=""><font face="courier new, monospace" class=""><br class=""></font></div><div class=""><font face="courier new, monospace" class="">test1 = run abc "ac"</font></div><div class=""><font face="courier new, monospace" class="">test2 = run abc "abc"</font></div><div class=""><font face="courier new, monospace" class="">test3 = run abc "ab"  -- should fail</font></div><div class=""><br class=""></div></div><div class=""><br class=""><div class="">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" class="">For example this parser doesn't parse "abc"<br class=""><br class="">test :: Parser String<br class="">test = ((try $ string "a") <|> (string "ab")) *> (string "c")<br class=""><br class="">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 class=""></div></blockquote></div></div></div></div></blockquote><div class=""><br class=""></div>If you use uu-parsinglib all your problems will be gone. No need to hasskel around with “try” constructs. All alternatives are tried “in parallel”.</div><div class=""><br class=""></div><div class=""> Doaitse</div><div class=""><br class=""></div><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><div class=""><blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr" class=""><br class="">(try a <|> b) *> c<br class=""><br class="">Something like<br class=""><br class="">(tryOtherBranchesIfFail (try a <|> b)) *> c<br class=""><br class="">So if it cannot parse "abc" with (try a *> c) it could return and try (b *> c)<br class="">Or it isn't possible?<br class=""><br class=""></div></blockquote></div></div></div>_______________________________________________<br class="">Haskell-Cafe mailing list<br class=""><a href="mailto:Haskell-Cafe@haskell.org" class="">Haskell-Cafe@haskell.org</a><br class=""><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class=""></div></blockquote></div><br class=""></body></html>