parsec-3.1.0 с пользовательским типом данных токена

StackOverflow https://stackoverflow.com/questions/2473615

  •  20-09-2019
  •  | 
  •  

Вопрос

парсек-3.1.0 ( http://hackage.haskell.org/package/parsec-3.1.0 ) работает с любым типом токена.Однако существуют комбинаторы, такие как Text.Parsec.Char.satisfy, которые определены только для типа данных Char.Похоже, что более общего аналога не существует.

Должен ли я определить свои собственные версии или я что-то пропустил?

Возможно, в Haskell существуют разные библиотеки синтаксического анализа, которые позволяют:

  • пользовательские типы токенов
  • пользовательское состояние анализатора (мне нужно проанализировать формат с сохранением состояния - Wavefront OBJ)
Это было полезно?

Решение

Обобщенные версии oneOf, noneOf, и anyChar может быть построен на основе обобщенного satisfy, достаточно легко:

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

Может показаться, что их обобщение отсутствует, но вы заметите, что эти обобщения здесь делают определенные предположения о типе t это может быть неверно для чьего-либо типа токена.Предполагается, что это экземпляр Show и Eq, тем не менее, я могу представить себе типы токенов , для которых они отображаются каким - то другим способом , чем show, и что членство в классе токенов может быть достигнуто с помощью какого - либо метода , отличного от == и elem.

Наконец, как только ваш тип токена больше не будет Char, то, как вы решите представлять позицию и, следовательно, обновите ее, сильно зависит от вашего представления токенов и потоков.

Следовательно, я могу понять, почему более обобщенной формы не существует.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top