Spec-Zone.ru › Haskell 7

Text.ParserCombinators.ReadP

Авторские права (c) Университет Глазго 2002
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддерживающий libraries@haskell.org
Стабильность предварительная
Переносимость непереносимая (локальная универсальная квантификация)
Safe Haskell Надёжный
Язык Haskell2010

Содержание

  • Тип ReadP
  • Базовые операции
  • Другие операции
  • Запуск анализатора
  • Свойства

Описание

Это библиотека парсерных комбинаторов, первоначально написанная Koen Claessen. Она анализирует все альтернативы параллельно, поэтому она никогда не хранит начало входной строки, что является распространённым источником утечек памяти у других парсеров. Комбинатор выбора '(+++)' действительно коммутативный; не имеет значения, какая ветвь «короче».

Тип ReadP

data ReadP a Источник

Примеры реализации

Monad ReadP
Functor ReadP
Applicative ReadP
MonadPlus ReadP
Alternative ReadP

Базовые операции

get :: ReadP Символ Источник

Потребляет и возвращает следующий символ. Возвращает ошибку, если входных данных больше нет.

look :: ReadP Строка Источник

Предварительный просмотр: возвращает оставшуюся часть входных данных без её потребления.

(+++) :: ReadP a -> ReadP a -> ReadP a infixr 5 Источник

Симметричный выбор.

(<++) :: ReadP a -> ReadP a -> ReadP a infixr 5 Источник

Локальный, эксклюзивный, левосторонний выбор: Если левая часть анализатора локально произведёт любой результат, то правая часть анализатора не используется.

gather :: ReadP a -> ReadP (Строка, a) Источник

Преобразует анализатор в такой, который выполняет то же самое, но дополнительно возвращает точные прочитанные символы. ВАЖНОЕ ПРИМЕЧАНИЕ: gather выдаёт ошибку выполнения, если её первый аргумент создан с использованием любых вхождений readS_to_P.

Другие операции

pfail :: ReadP a Источник

Всегда возвращает ошибку.

eof :: ReadP () Источник

Успешно завершается, если мы находимся в конце входных данных.

satisfy :: (Символ -> Булево) -> ReadP Символ Источник

Потребляет и возвращает следующий символ, если он удовлетворяет указанному предикату.

char :: Символ -> ReadP Символ Источник

Анализирует и возвращает указанный символ.

string :: Строка -> ReadP Строка Источник

Анализирует и возвращает указанную строку.

munch :: (Символ -> Булево) -> ReadP Строка Источник

Анализирует первую последовательность из нуля или более символов, удовлетворяющих предикату. Всегда успешен, точно один раз, потребляя все символы. Следовательно, НЕ то же самое, что (many (satisfy p)).

munch1 :: (Символ -> Булево) -> ReadP Строка Источник

Анализирует первую последовательность из одного или более символов, удовлетворяющих предикату. Возвращает ошибку, если нет ни одного, иначе успешен точно один раз, потребляя все символы. Следовательно, НЕ то же самое, что (many1 (satisfy p)).

skipSpaces :: ReadP () Источник

Пропускает все пробелы.

choice :: [ReadP a] -> ReadP a Источник

Объединяет все анализаторы в указанном списке.

count :: Целое -> ReadP a -> ReadP [a] Источник

count n p анализирует n вхождений p последовательно. Возвращается список результатов.

between :: ReadP open -> ReadP close -> ReadP a -> ReadP a Источник

between open close p анализирует open, за которым следует p, а затем и close. Возвращается только значение p.

option :: a -> ReadP a -> ReadP a Источник

option x p может либо проанализировать p, либо вернуть x без потребления каких-либо входных данных.

optional :: ReadP a -> ReadP () Источник

optional p необязательно анализирует p и всегда возвращает ().

many :: ReadP a -> ReadP [a] Источник

Анализирует ноль или более вхождений указанного анализатора.

many1 :: ReadP a -> ReadP [a] Источник

Анализирует одно или более вхождений указанного анализатора.

skipMany :: ReadP a -> ReadP () Source

Как many, но игнорирует результат.

skipMany1 :: ReadP a -> ReadP () Source

Как many1, но игнорирует результат.

sepBy :: ReadP a -> ReadP sep -> ReadP [a] Source

sepBy p sep анализирует ноль или более вхождений p, разделённых sep. Возвращает список значений, возвращаемых p.

sepBy1 :: ReadP a -> ReadP sep -> ReadP [a] Source

sepBy1 p sep анализирует одно или более вхождений p, разделённых sep. Возвращает список значений, возвращаемых p.

endBy :: ReadP a -> ReadP sep -> ReadP [a] Source

endBy p sep анализирует ноль или более вхождений p, разделённых и завершённых sep.

endBy1 :: ReadP a -> ReadP sep -> ReadP [a] Source

endBy p sep анализирует одно или более вхождений p, разделённых и завершённых sep.

chainr :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a Source

chainr p op x анализирует ноль или более вхождений p, разделённых op. Возвращает значение, полученное путём правой ассоциативного применения всех функций, возвращаемых op. Если вхождений p нет, возвращается x.

chainl :: ReadP a -> ReadP (a -> a -> a) -> a -> ReadP a Source

chainl p op x анализирует ноль или более вхождений p, разделённых op. Возвращает значение, полученное путём левой ассоциативного применения всех функций, возвращаемых op. Если вхождений p нет, возвращается x.

chainl1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a Source

Как chainl, но анализирует одно или более вхождений p.

chainr1 :: ReadP a -> ReadP (a -> a -> a) -> ReadP a Source

Как chainr, но анализирует одно или более вхождений p.

manyTill :: ReadP a -> ReadP end -> ReadP [a] Source

manyTill p end анализирует ноль или более вхождений p, пока end не успешно. Возвращает список значений, возвращаемых p.

Запуск анализатора

type ReadS a = String -> [(a, String)] Source

Анализатор для типа a, представленный как функция, которая принимает String и возвращает список возможных анализов в виде (a,String) пар.

Обратите внимание, что этот тип рекурсивного анализатора очень неэффективен; чтение большой структуры может быть довольно медленным (см. ReadP).

readP_to_S :: ReadP a -> ReadS a Source

Преобразует анализатор в функцию стиля Haskell ReadS. Это основной способ "запуска" анализатора ReadP: расширенный тип — readP_to_S :: ReadP a -> String -> [(a,String)]

readS_to_P :: ReadS a -> ReadP a Source

Преобразует функцию стиля Haskell ReadS в анализатор. Предупреждение: это вводит локальное обратное ветвление в результирующий анализатор, что может привести к неэффективности.

Свойства

Ниже приведены спецификации QuickCheck для того, что делают комбинаторы. Это можно рассматривать как формальные спецификации поведения комбинаторов.

Мы используем множества для придания семантики комбинаторам.

 type Bag a = [a]

Равенство на множествах не учитывает порядок элементов.

 (=~) :: Ord a => Bag a -> Bag a -> Bool
 xs =~ ys = sort xs == sort ys

Специальный оператор равенства, чтобы избежать неразрешённой перегрузки при тестировании свойств.

 (=~.) :: Bag (Int,String) -> Bag (Int,String) -> Bool
 (=~.) = (=~)

Далее следуют свойства:

 prop_Get_Nil =
   readP_to_S get [] =~ []

 prop_Get_Cons c s =
   readP_to_S get (c:s) =~ [(c,s)]

 prop_Look s =
   readP_to_S look s =~ [(s,s)]

 prop_Fail s =
   readP_to_S pfail s =~. []

 prop_Return x s =
   readP_to_S (return x) s =~. [(x,s)]

 prop_Bind p k s =
   readP_to_S (p >>= k) s =~.
     [ ys''
     | (x,s') <- readP_to_S p s
     , ys''   <- readP_to_S (k (x::Int)) s'
     ]

 prop_Plus p q s =
   readP_to_S (p +++ q) s =~.
     (readP_to_S p s ++ readP_to_S q s)

 prop_LeftPlus p q s =
   readP_to_S (p <++ q) s =~.
     (readP_to_S p s +<+ readP_to_S q s)
  where
   [] +<+ ys = ys
   xs +<+ _  = xs

 prop_Gather s =
   forAll readPWithoutReadS $ \p ->
     readP_to_S (gather p) s =~
       [ ((pre,x::Int),s')
       | (x,s') <- readP_to_S p s
       , let pre = take (length s - length s') s
       ]

 prop_String_Yes this s =
   readP_to_S (string this) (this ++ s) =~
     [(this,s)]

 prop_String_Maybe this s =
   readP_to_S (string this) s =~
     [(this, drop (length this) s) | this `isPrefixOf` s]

 prop_Munch p s =
   readP_to_S (munch p) s =~
     [(takeWhile p s, dropWhile p s)]

 prop_Munch1 p s =
   readP_to_S (munch1 p) s =~
     [(res,s') | let (res,s') = (takeWhile p s, dropWhile p s), not (null res)]

 prop_Choice ps s =
   readP_to_S (choice ps) s =~.
     readP_to_S (foldr (+++) pfail ps) s

 prop_ReadS r s =
   readP_to_S (readS_to_P r) s =~. r s

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Text-ParserCombinators-ReadP.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API