Ich versuche, etwas Text mit Parsec zu analysieren:
%Vor% Ich erwarte choice
, um zu versuchen, "leave" zu treffen, und wenn es fehlschlägt, dann versuche "login" usw. Aber es versucht nur "leave" zu treffen, und wenn es fehlschlägt, gibt es einen Fehler.
Was mache ich falsch?
Parsec kehrt nicht automatisch so zurück (für Effizienz). Die Regel ist, dass, sobald eine Verzweigung ein Token akzeptiert, alternative Verzweigungen abgeschnitten werden. Die Lösung besteht darin, ein explizites Backtracking mit try (string "leave")
und try (string "login")
etc hinzuzufügen.
In Ihrem Beispiel ist das Zeichen 'l' das Token, das Parsec an den ersten Zweig "leave" weiterleitet und die nächsten Zweige von "login" und "join" abbricht.
Mehr Details in Real World Haskell (Buch, online) auf Parsec .