Parsek (parser)

Parsek
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 ; 16 lat temu ( 2006-11-02 )
Wersja stabilna
3.1.14.0 / 10 sierpnia 2019 ; 3 lata temu ( 2019-08-10 )
Magazyn github.com/haskell/parsec _ _ _
Napisane w Haskella
System operacyjny Linuks , macOS , Windows
Platforma Platforma Haskella
Typ Kombinator parserów , biblioteka
Licencja BSD-3
Strona internetowa hackage .haskell .org /package /parsec

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" 

Linki zewnętrzne