Parsec (parser)
Page Module:Infobox/styles.css has no content.
| Parsec | |
|---|---|
| [[Programmer|Original authorTemplate:Pluralize from text]] | Daan Leijen, Paolo Martini, Antoine Latter |
| [[Programmer|DeveloperTemplate:Pluralize from text]] | Herbert Valerio Riedel, Derek Elkins, Antoine Latter, Roman Cheplyaka, Ryan Scott |
| Initial release | November 2, 2006[1] |
| Written in | Haskell |
| Operating system | Linux, macOS, Windows |
| Platform | Haskell Platform |
| Available in | English |
| Type | Parser combinator, library |
| License | BSD-2-clause |
| Website | hackage |
| Repository | github |
Script error: No such module "Check for conflicting parameters".
Parsec is a library for writing parsers written in the programming language Haskell.[3] It is based on higher-order parser combinators, so a complicated parser can be made out of many smaller ones.[4] It has been reimplemented in many other languages, including Erlang,[5] Elixir,[6] OCaml,[7] Racket,[8] F#,[9][10] and the imperative programming languages C#,[11] and Java.[12]
Because a parser combinator-based program is generally slower than a parser generator-based program,[citation needed] Parsec is normally used for small domain-specific languages, while Happy is used for compilers such as the Glasgow Haskell Compiler (GHC).[13]
Other Haskell parser combinator libraries that have been derived from Parsec include Megaparsec[14] and Attoparsec.[15]
Parsec is free software released under the BSD-3-Clause license.[16]
Example
Parsers written in Parsec start with simpler parsers, such as ones that recognize certain strings, and combine them to build a parser with more complicated behavior. For example, digit parses a digit, and string parses a specific string (like "hello").
Parser combinator libraries like Parsec provide utility functions to run the parsers on real values. A parser to recognize a single digit from a string can be split into two functions: one to create the parser, and a main function that calls one of these utility functions (parse in this case) to run the parser:
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"'
We define a Parser type to make the type signature of parser easier to read. If we wanted to alter this program, say to read either the string "hello" or the string "goodbye", we could use the operator <|>, provided by the Alternative typeclass, to combine two parsers into a single parser that tries either:
parser = string "hello" <|> string "goodbye"
References
Page Template:Reflist/styles.css has no content.
- ^ Page Module:Citation/CS1/styles.css has no content."parsec 2.0". Hackage. Retrieved 3 September 2019.
- ^ Page Module:Citation/CS1/styles.css has no content."Releases". Github. Retrieved 22 September 2024.
- ^ Page Module:Citation/CS1/styles.css has no content."Parsec on Haskell wiki". Haskell Wiki. Retrieved 29 May 2017.
- ^ Page Module:Citation/CS1/styles.css has no content.Leijen, Daan; Meijer, Erik (July 2001). "Parsec: Direct Style Monadic Parser Combinators For The Real World" (PDF). Microsoft Research. Retrieved 22 November 2014.
- ^ Page Module:Citation/CS1/styles.css has no content."Parsec Erlang". BitBucket. Archived from the original on 29 November 2014. Retrieved 23 November 2014.
- ^ Page Module:Citation/CS1/styles.css has no content."Nimble Parsec". Github. Retrieved 18 December 2018.
- ^ Page Module:Citation/CS1/styles.css has no content."Parsec OCaml" (PDF). The OCaml Summer Project. Retrieved 23 November 2014.
- ^ Page Module:Citation/CS1/styles.css has no content."Megaparsack: Practical Parser Combinators".
- ^ Page Module:Citation/CS1/styles.css has no content."XParsec by corsis". XParsec. Retrieved 29 May 2017.
- ^ Page Module:Citation/CS1/styles.css has no content."FParsec". Quanttec. Retrieved 29 May 2017.
- ^ Page Module:Citation/CS1/styles.css has no content."CSharp monad". Github. Retrieved 10 December 2014.
- ^ Page Module:Citation/CS1/styles.css has no content."JParsec". Github. Retrieved 14 October 2016.
- ^ Page Module:Citation/CS1/styles.css has no content."The Glasgow Haskell Compiler (AOSA Vol. 2)". The Architecture of Open Source Applications. Retrieved 23 November 2014.
- ^ Page Module:Citation/CS1/styles.css has no content."megaparsec: Monadic parser combinators". Hackage. Retrieved 2018-09-10.
- ^ Page Module:Citation/CS1/styles.css has no content."attoparsec: Fast combinator parsing for bytestrings and text". Hackage. Retrieved 2018-09-10.
- ^ Page Module:Citation/CS1/styles.css has no content."Parsec". GitHub. 25 October 2021.
External links
Lua error in mw.title.lua at line 404: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').