Pregunta

parsec-3.1.0 ( http://hackage.haskell.org/package /parsec-3.1.0 ) funciona con cualquier tipo de token. Sin embargo, existen combinadores como Text.Parsec.Char.satisfy que sólo se definen para Char tipo de datos. No parece haber ninguna contraparte más general disponible.

¿Debo definir mis propias versiones o me he perdido algo?

Tal vez hay diferentes bibliotecas del analizador en Haskell que permite:

  • tipos de tokens de encargo
  • Estado analizador personalizado (necesito para analizar el formato de estado - Wavefront OBJ)
¿Fue útil?

Solución

Las versiones generalizadas de oneOf, noneOf y anyChar puede construirse a partir de un satisfy generalizada, con bastante facilidad:

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

Podría parecer que la generalización de éstos parece que falta, pero se dará cuenta de que estas generalizaciones aquí hacen ciertas suposiciones sobre la t tipo que puede no ser cierto para el tipo de contadores a alguien. Se supone que es una instancia de Show y Eq, sin embargo, se puede imaginar tipos de tokens para el que se muestran alguna otra manera que show, y que la pertenencia a una clase de tokens podría lograrse a través de algún otro método que == y elem.

Por último, una vez que su tipo de token ya no es un Char, cómo usted elige para representar la posición, y por lo tanto se actualiza, es dependiente en su representación de fichas altamente y arroyos.

Por lo tanto, puedo ver por qué una forma más generalizada no existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top