2017-05-20 11 views
0

J'essaie la bibliothèque parsec et je ne sais pas comment gérer cette tâche de base.Vérification si l'entrée restante est un espace avec le parsec

Supposons que je donne les résultats suivants:

data Foo = A | AB 

et je veux la chaîne "a" à analyser comme A et "a b" AB. Si je viens de le faire:

parseA :: parser Foo 
parseA = do 
      reserved "a" 
      return A 

parseAB :: parser Foo 
parseAB = do 
      reserved "a" 
      reserved "b" 
      return AB 

parseFoo :: parser Foo 
parseFoo = parseA 
     <|> parseAB 

puis parseFoo analysera « un b » comme A depuis parseA ne se soucie pas qu'il n'y a pas encore des espaces à gauche après la consommation du « a ». Comment cela peut-il être réparé?

Répondre

3

Vous devez changer la grammaire en AB | A et utiliser try à partir de parsec, ce qui donne une capacité de lecture anticipée à votre analyseur.

Cela devrait fonctionner

parseFoo = try Parse AB <|> parse A 
+0

Désolé, je aurais dû préciser que mon 'parseAB' fonctionne très bien, il est' parseFoo' que je vais avoir des problèmes avec. – user181407

+0

ah, j'ai compris. votre grammaire a besoin de revenir en arrière –

+1

vous devez modifier la grammaire en AB | A et utiliser 'try' à partir de parsec –