Parsek (parser)
Oryginalni autorzy | Daan Leijen, Paolo Martini, Antoine Latter |
---|---|
Deweloperzy | Herbert Valerio Riedel, Derek Elkins, Antoine Latter, Roman Cheplyaka, Ryan Scott |
Pierwsze wydanie | 2 listopada 2006 |
Wersja stabilna | 3.1.14.0 / 10 sierpnia 2019
|
Magazyn | |
Napisane w | Haskella |
System operacyjny | Linuks , macOS , Windows |
Platforma | Platforma Haskella |
Typ | Kombinator parserów , biblioteka |
Licencja | BSD-3 |
Strona internetowa |
Parsec to biblioteka do pisania parserów w Haskell . Opiera się na kombinatorach parsera wyższego rzędu , więc złożony parser może być złożony z wielu mniejszych. Został ponownie zaimplementowany w wielu innych językach, w tym Erlang , Elixir , OCaml i F# , a także w językach imperatywnych , takich jak C# i Java .
Ponieważ program oparty na kombinatorze parsera jest generalnie wolniejszy niż program oparty na generatorze parsera , Parsec jest zwykle używany w małych językach specyficznych dla domeny , podczas gdy Happy jest używany w kompilatorach, takich jak GHC .
Inne biblioteki kombinatora parsera Haskell, które wywodzą się z Parsec, to Megaparsec i Attoparsec.
Parsec jest wolnym oprogramowaniem wydanym na licencji BSD-3-Clause.
Przykład
Parsery napisane w Parsec zaczynają się od prostszych parserów, takich jak te, które rozpoznają określone ciągi znaków i łączą je, tworząc parser o bardziej skomplikowanym działaniu. Na przykład digit
analizuje cyfrę, a string
analizuje określony ciąg znaków (np. „hello”
).
Biblioteki kombinatorów parsera, takie jak Parsec, zapewniają funkcje użytkowe do uruchamiania parserów na rzeczywistych wartościach. Parser do rozpoznawania pojedynczej cyfry z łańcucha można podzielić na dwie funkcje: jedną do tworzenia parsera i główną funkcję
, która wywołuje jedną z tych funkcji użytkowych ( w tym przypadku parse
) w celu uruchomienia parsera:
import Text.Parsec -- posiada ogólne funkcje analizujące import Text.Parsec.Char -- zawiera określone podstawowe kombinatory typu Parser = Stream s m Char => ParsecT s u m String parser :: Parser parser = string "hello" main :: IO () main = print ( analizuje parser
"<test>" "witaj świecie" ) -- drukuje „Dobrze „witaj””
Definiujemy typ Parsera , aby
ułatwić odczytanie sygnatury typu parsera .
Gdybyśmy chcieli zmodyfikować ten program, powiedzmy, aby odczytać ciąg znaków „hello”
lub ciąg znaków „goodbye”
, moglibyśmy użyć operatora <|>
, dostarczonego przez klasę Alternative
typeclass, aby połączyć dwa parsery w pojedynczy parser, który próbuje albo :
parser = string "cześć" <|> string "do widzenia"