Парсек (парсер)
Оригинальный автор(ы) | Олд Лейен, Паоло Мартини, Антуан Леттер |
---|---|
Разработчик(и) | Герберт Валерио Ридель, Дерек Элкинс, Антуан Леттер, Роман Чепляка, Райан Скотт |
Первоначальный выпуск | 2 ноября 2006 г [1] |
Стабильная версия | 3.1.14.0
/ 10 августа 2019 г [2] |
Репозиторий | github |
Написано в | Хаскелл |
Операционная система | Linux , MacOS , Windows |
Платформа | Платформа Хаскелл |
Тип | Парсер-комбинатор , Библиотека |
Лицензия | БСД-3 |
Веб-сайт | хакерство |
Parsec — библиотека для написания парсеров на Haskell . [3] Он основан на комбинаторах парсеров высшего порядка , поэтому сложный парсер можно составить из множества более мелких. [4] Он был переопределен во многих других языках, включая Эрланг , [5] Эликсир , [6] ОКамл , [7] Ракетка , [8] и Ф# , [9] [10] а также императивные языки, такие как С# , [11] и Ява . [12]
Поскольку программа, основанная на синтаксическом комбинаторе, обычно работает медленнее, чем программа, основанная на генераторе синтаксического анализатора , [ нужна ссылка ] Parsec обычно используется для небольших предметно-ориентированных языков , а Happy — для таких компиляторов, как GHC . [13]
Другие библиотеки-комбинаторы парсеров Haskell, полученные из Parsec, включают Megaparsec. [14] и Аттопарсек. [15]
Parsec — бесплатное программное обеспечение , выпущенное по лицензии BSD-3-Clause. [16]
Пример
[ редактировать ]Анализаторы, написанные на Parsec, начинаются с более простых анализаторов, например, распознающих определенные строки, и объединяют их для создания анализатора с более сложным поведением. Например, digit
анализирует цифру и string
анализирует определенную строку (например, "hello"
).
Библиотеки-комбинаторы анализаторов, такие как Parsec, предоставляют служебные функции для запуска анализаторов реальных значений. Синтаксический анализатор, распознающий одну цифру из строки, можно разделить на две функции: одну для создания анализатора, а другую — для создания анализатора. main
функция, которая вызывает одну из этих служебных функций ( parse
в данном случае) для запуска парсера:
import Text.Parsec -- has general parsing utility functions
import Text.Parsec.Char -- contains specific basic combinators
type Parser = Stream s m Char => ParsecT s u m String
parser :: Parser
parser = string "hello"
main :: IO ()
main = print (parse parser "<test>" "hello world")
-- prints 'Right "hello"'
Мы определяем Parser
type, чтобы сделать сигнатуру типа parser
легче читать. Если бы мы хотели изменить эту программу, скажем, прочитать строку "hello"
или строка "goodbye"
, мы могли бы использовать оператор <|>
, предоставленный Alternative
класс типов, чтобы объединить два парсера в один, который пытается:
parser = string "hello" <|> string "goodbye"
Ссылки
[ редактировать ]- ^ «парсек 2.0» . Хакадж . Проверено 3 сентября 2019 г.
- ^ «Выпуски» . Гитхаб . Проверено 3 сентября 2019 г.
- ^ «Парсек на Haskell вики» . Хаскелл Вики . Проверено 29 мая 2017 г.
- ^ Лейен, Даан; Мейер, Эрик (июль 2001 г.). «Parsec: комбинаторы монадических парсеров прямого стиля для реального мира» (PDF) . Исследования Майкрософт . Проверено 22 ноября 2014 г.
- ^ «Парсек Эрланг» . Битбакет . Проверено 23 ноября 2014 г.
- ^ «Проворный парсек» . Гитхаб . Проверено 18 декабря 2018 г.
- ^ «Парсек OCaml» (PDF) . Летний проект OCaml . Проверено 23 ноября 2014 г.
- ^ «Мегапарсак: Практические комбинаторы парсеров» .
- ^ «XParsec от Corsis» . XParsec . Проверено 29 мая 2017 г.
- ^ «ФПарсек» . Кванттек . Проверено 29 мая 2017 г.
- ^ «CSharp монада» . Гитхаб . Проверено 10 декабря 2014 г.
- ^ "ДжПарсек" . Гитхаб . Проверено 14 октября 2016 г.
- ^ «Компилятор Glasgow Haskell (AOSA Vol. 2)» . Архитектура приложений с открытым исходным кодом . Проверено 23 ноября 2014 г.
- ^ «мегапарсек: комбинаторы монадических парсеров» . Хакадж . Проверено 10 сентября 2018 г.
- ^ «attoparsec: быстрый анализ комбинатора байтовых строк и текста» . Хакадж . Проверено 10 сентября 2018 г.
- ^ «Парсек» . 25 октября 2021 г.
Внешние ссылки
[ редактировать ]