Text.ParserCombinators.ReadP
| Авторские права | (c) Университет Глазго 2002 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддерживающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | непереносимая (локальная универсальная квантификация) |
| Safe Haskell | Надёжный |
| Язык | Haskell2010 |
Описание
Это библиотека парсерных комбинаторов, первоначально написанная Koen Claessen. Она анализирует все альтернативы параллельно, поэтому она никогда не хранит начало входной строки, что является распространённым источником утечек памяти у других парсеров. Комбинатор выбора '(+++)' действительно коммутативный; не имеет значения, какая ветвь «короче».
Тип 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.
Другие операции
Всегда возвращает ошибку.
Успешно завершается, если мы находимся в конце входных данных.
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