2016-10-28 4 views
1

J'essaye de déboguer pourquoi malgré la combinaison optionMaybe avec try, parsec consomme l'entrée. Fondamentalement dans le code ci-dessous, pourquoi la deuxième exécution ne retourne pas Right "abc" (ce qui est ce que je m'attends)?L'option Parsec Peut toujours consommer l'entrée

Compte tenu

myParser = do 
    optionMaybe $ try (between (char '/') (char '/') $ many1 (noneOf "/") 
    many1 (noneOf "/") 

Je reçois

> parse myParser "" "/abc/def" 
Right "def" 

> parse myParser "" "/abc" 
Left (line 1, column 5): 
unexpected end of input 
expecting "/" 

Répondre

3

L'ensemble de between (char '/') (char '/') $ many1 (noneOf "/") échoue en raison de la fermeture manquants '/' dans "/abc", et ainsi optionMaybe $ try $ between ... ne consomme rien (et les résultats dans Nothing). Il vous reste tout de "/abc" de l'entrée, ce qui bien sûr ne correspond pas à l'analyseur restante many1 (noneOf "/").

+0

Oui, je viens de le réaliser moi-même. Une erreur stupide! Merci. –