2010-10-13 4 views
5

Désolé si c'est une question novice - je veux analyser quelque chose défini parComment récupérer la valeur de l'analyseur en option dans Parsec?

Exp :: = Mandatory_Part Optional_Part0 Optional_Part1

Je pensais que je pouvais faire ceci:

proc::Parser String 

proc = do { 

    ;str<-parserMandatoryPart 

    ;str0<-optional(parserOptionalPart0) --(1) 

    ;str1<-optional(parserOptionalPart1) --(2) 

    ;return str++str0++str1 

} 

Je veux obtenir str0/str1 si des parties optionnelles sont présentes, sinon, str0/str1 serait "". Mais (1) et (2) ne fonctionneront pas puisque optional() ne permet pas d'extraire le résultat de ses paramètres, dans ce cas, parserOptionalPart0/parserOptionalPart1.

Maintenant, quelle serait la correcte façon de le faire?

Merci beaucoup!

Billy R

Répondre

6

La fonction que vous cherchez est optionMaybe. Il renvoie Nothing si l'analyseur a échoué et renvoie le contenu au Just s'il a consommé l'entrée.

+1

Merci Paul. Cela a fonctionné pour moi. –

+1

Fonctionne juste. X7D – dmvianna

4

De the docs:

option x p essaie d'appliquer l'analyseur p. Si p échoue sans consommer d'entrée, il renvoie la valeur x, sinon la valeur renvoyée par p.

Vous pourriez faire:

proc :: Parser String 
proc = do 
    str <- parserMandatoryPart 
    str0 <- option "" parserOptionalPart0 
    str1 <- option "" parserOptionalPart1 
    return (str++str0++str1) 

Attention à la partie "sans entrée consommer". Vous devrez peut-être envelopper soit l'un, soit les deux parseurs optionnels avec try.

J'ai également ajusté votre style de code pour qu'il soit plus standard et j'ai corrigé une erreur sur la dernière ligne. return n'est pas un mot-clé; c'est une fonction ordinaire. Ainsi, return a ++ b est (return a) ++ b, c'est-à-dire presque jamais ce que vous voulez.

+0

Keegan, merci pour la réponse et corriger mon code. Cela fonctionnait surtout comme je le voulais - il y a quelques problèmes avec des cas non décrits dans le message original. Je suis nouveau à la fois Haskell et Parsec, je vais juste lire et essayer plus. Merci. –

Questions connexes