2010-03-18 4 views
3

parsec-3.1.0 (http://hackage.haskell.org/package/parsec-3.1.0) fonctionne avec n'importe quel type de jeton. Cependant, il existe des combinateurs comme Text.Parsec.Char.satisfy qui ne sont définis que pour le type de données Char. Il ne semble pas y avoir plus de contrepartie générale disponible. Dois-je définir mes propres versions ou ai-je oublié quelque chose?parsec-3.1.0 avec le type de données de jeton personnalisé

Peut-être il y a différentes bibliothèques d'analyseur dans Haskell qui permet:

  • types de jeton sur mesure
  • état de l'analyseur personnalisé (je dois analyser le format stateful - Wavefront OBJ)

Répondre

4

versions Generalized de oneOf, noneOf, et anyChar peut être construit sur un satisfy généralisé, assez facilement:

oneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t 
oneOfT ts = satisfyT (`elem` ts) 

noneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t 
noneOfT ts = satisfyT (not . (`elem` ts)) 

anyT :: (Show t, Stream s m t) => ParsecT s u m t 
anyT = satisfyT (const True) 

satisfyT :: (Show t, Stream s m t) => (t -> Bool) -> ParsecT s u m t 
satisfyT p = tokenPrim showTok nextPos testTok 
    where 
     showTok t  = show t 
     testTok t  = if p t then Just t else Nothing 
     nextPos p t s = -- however you update position for your token stream 

Il peut sembler que la généralisation de ces éléments semble manquante, mais vous remarquerez que ces généralisations supposent que le type t peut ne pas être vrai pour le type de jeton de quelqu'un. Il est supposé être une instance de Show et Eq, mais je peux imaginer des types de jetons pour lesquels ils sont affichés d'une autre manière que show, et que l'appartenance à une classe de jetons peut être obtenue via une autre méthode que == et elem. Enfin, une fois que votre type de jeton n'est plus un Char, la manière dont vous choisissez de représenter la position, et donc de la mettre à jour, dépend fortement de votre représentation des jetons et des flux. Par conséquent, je peux voir pourquoi une forme plus généralisée n'existe pas.

+0

Les questions que vous avez nommés peuvent être résolus par: classe de types> Jeton de classe où un > showTok :: a -> Chaîne > nextPosTok :: (type approprié ici) > ... En fin de compte vous pouvez toujours 'newtype' votre type de jeton et fournir vos propres définitions. – Tener

+0

@Tener - En effet, c'est comme cela que je le ferais - mais Parsec 3 n'a pas mis la fonction nextPos dans la classe de type Stream, ni défini une classe de type Token. – MtnViewMark

Questions connexes