Question

parsec-3.1.0 ( http://hackage.haskell.org/package /parsec-3.1.0 ) fonctionne avec tout type de jeton. Cependant, il y a des combinateurs comme Text.Parsec.Char.satisfy qui ne sont définis pour Char type de données. Il ne semble pas y avoir de contrepartie plus général disponible.

Dois-je définir mes propres versions ou ai-je raté quelque chose?

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

  • types de jeton sur commande
  • état de l'analyseur personnalisé (je dois analyser le format stateful - Wavefront OBJ)
Était-ce utile?

La solution

versions de oneOf Generalized, noneOf et anyChar peuvent être construits à partir d'une satisfy généralisée, 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 semble manquer, mais vous remarquerez que ces généralisations ici font certaines hypothèses au sujet de la t de type qui ne peut pas être vrai pour le type de jeton de quelqu'un. Il est considéré comme une instance de Show et Eq et pourtant je peux imaginer les types de jeton pour lequel ils sont affichés d'une autre manière que show et que l'appartenance à une classe de jetons peut être obtenue par une méthode autre que == et elem.

Enfin, une fois n'est votre type de jeton plus un Char, comment vous choisissez de représenter la position, et donc mis à jour, est fortement dépendante de votre représentation des jetons et des cours d'eau.

Par conséquent, je ne vois pas pourquoi une forme plus généralisée n'existe pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top