2016-10-28 1 views
1

Ich versuche zu debuggen warum trotz der Kombinationmit try, Parsec verbraucht den Eingang. Grundsätzlich im folgenden Code, warum ist der zweite Lauf nicht Right "abc" zurück (was ist, was ich erwarte)?Parsec optionMaybe immer konsumieren Eingabe

Given

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

ich

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

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

Antwort

3

Die gesamte between (char '/') (char '/') $ many1 (noneOf "/") nicht aufgrund der fehlenden Schließung '/' in "/abc", und so optionMaybe $ try $ between ... verbraucht nichts (und Ergebnisse in Nothing). Sie sind mit allen "/abc" der Eingabe übrig, die natürlich nicht mit dem verbleibenden Parser many1 (noneOf "/") übereinstimmt.

+0

Ja, ich habe es gerade selbst realisiert. Ein dummer Fehler! Vielen Dank. –