Difference between revisions of "Parsec"
(Update ghc/parsec link to point to latest version of ghc) |
|||
(16 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
⚫ | |||
− | |||
[[Category:Compiler tools]] |
[[Category:Compiler tools]] |
||
[[Category:Combinators]] |
[[Category:Combinators]] |
||
+ | [[Category:Packages]] |
||
+ | [[Category:Libraries]] |
||
+ | |||
+ | == Introduction == |
||
Parsec is an industrial strength, monadic parser combinator library for |
Parsec is an industrial strength, monadic parser combinator library for |
||
Haskell. It can parse context-sensitive, infinite look-ahead grammars |
Haskell. It can parse context-sensitive, infinite look-ahead grammars |
||
but it performs best on predictive (LL[1]) grammars. |
but it performs best on predictive (LL[1]) grammars. |
||
+ | The latest stable release with Haddock documentation is available on [http://hackage.haskell.org/package/parsec Hackage] and development versions are [http://code.haskell.org/parsec3/ available via the darcs repository]. |
||
− | For downloads and documentation see: |
||
⚫ | |||
− | * [http://hackage.haskell.org/package/parsec hackage] |
||
− | * [http://www.haskell.org/ghc/docs/latest/html/libraries/parsec/Text-ParserCombinators-Parsec.html GHC library documentation] |
||
+ | |||
⚫ | |||
⚫ | |||
Parsec lets you construct parsers by combining higher-order |
Parsec lets you construct parsers by combining higher-order |
||
Line 21: | Line 21: | ||
[[Happy]] parsers, which must be generated via a preprocessor. |
[[Happy]] parsers, which must be generated via a preprocessor. |
||
+ | An example for parsing a simple grammar of expressions can be found [http://www.haskell.org/haskellwiki/Parsing_expressions_and_statements here]. |
||
⚫ | |||
+ | |||
⚫ | |||
{{Template:Stub}} |
{{Template:Stub}} |
||
+ | |||
⚫ | |||
+ | == Examples == |
||
+ | |||
+ | * [http://book.realworldhaskell.org/read/using-parsec.html "Using Parsec"] chapter on [http://book.realworldhaskell.org/ Real World Haskell]. |
||
+ | |||
+ | * [http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Parsing Write Yourself a Scheme in 48 Hours/Parsing]. Note, that where the example uses the read function, the Token module of Parsec could have been used, to handle numbers. |
||
+ | |||
+ | See also the [http://packdeps.haskellers.com/reverse/parsec list of reverse dependencies for Parsec]. |
||
+ | |||
⚫ | |||
* PCL for O'Caml http://lprousnth.files.wordpress.com/2007/08/pcl.pdf |
* PCL for O'Caml http://lprousnth.files.wordpress.com/2007/08/pcl.pdf |
||
Line 32: | Line 43: | ||
* Ruby Parsec, JParsec ported to Ruby http://jparsec.codehaus.org/Ruby+Parsec |
* Ruby Parsec, JParsec ported to Ruby http://jparsec.codehaus.org/Ruby+Parsec |
||
* FParsec for F# http://www.quanttec.com/fparsec/ |
* FParsec for F# http://www.quanttec.com/fparsec/ |
||
+ | * XParsec for F# http://corsis.github.com/XParsec/ is a type-and-source-polymorphic, generalized and extensible parsec implementation in F# 3.0 which supports powerful domain-specific non-linear navigation combinators (such as for XML trees) |
||
− | * A small Parsec in Erlang http://www.engr.uconn.edu/~jeffm/Source/Erlang/ |
||
+ | * Parsec-Erlang, http://bitbucket.org/dmercer/parsec-erlang/ is a faithful reproduction of Parsec in Erlang (there is also an older toy Parsec-like parser that isn't monadic, nor does it give error messages: http://www.engr.uconn.edu/~jeffm/Source/Erlang/) |
||
* AliceParsec for Alice ML http://www.ps.uni-sb.de/alice/contribs.html |
* AliceParsec for Alice ML http://www.ps.uni-sb.de/alice/contribs.html |
||
* Parsnip for C++ http://parsnip-parser.sourceforge.net/ |
* Parsnip for C++ http://parsnip-parser.sourceforge.net/ |
||
* Somewhere there is a Nemerle port |
* Somewhere there is a Nemerle port |
||
* Pysec for Python http://www.valuedlessons.com/2008/02/pysec-monadic-combinatoric-parsing-in.html |
* Pysec for Python http://www.valuedlessons.com/2008/02/pysec-monadic-combinatoric-parsing-in.html |
||
+ | * JSParsec for JavaScript: http://code.google.com/p/jsparsec/ |
||
Interesting non-Parsec parser combinator libraries: |
Interesting non-Parsec parser combinator libraries: |
||
+ | * Parse::RecDescent for Perl https://metacpan.org/module/Parse::RecDescent |
||
* Spirit for C++ http://spirit.sourceforge.net/documentation.html |
* Spirit for C++ http://spirit.sourceforge.net/documentation.html |
||
+ | |||
− | * Scala http://www.scala-lang.org/docu/files/api/scala/util/parsing/combinator$content.html |
||
+ | == Links == |
||
+ | |||
⚫ | |||
+ | |||
⚫ | |||
+ | * [http://research.microsoft.com/en-us/um/people/daan/parsec.html on Microsoft] (content same as above) |
||
+ | |||
+ | === Blog articles === |
||
+ | |||
+ | * [http://therning.org/magnus/archives/289 Adventures in parsing] by Magnus Therning |
||
+ | * [http://therning.org/magnus/archives/290 More adventures in parsing] |
||
+ | * [http://therning.org/magnus/archives/295 Adventures in parsing, part 3] |
||
+ | * [http://therning.org/magnus/archives/296 Adventures in parsing, part 4] |
||
+ | |||
+ | * [http://panicsonic.blogspot.com/2009/12/adventures-in-parsec.html Adventures in Parsec] by Antoine Latter |
||
+ | |||
+ | === Other === |
||
+ | |||
+ | * [http://stackoverflow.com/questions/tagged/parsec Parsec] on Stack Overflow |
Revision as of 13:01, 16 September 2012
Introduction
Parsec is an industrial strength, monadic parser combinator library for Haskell. It can parse context-sensitive, infinite look-ahead grammars but it performs best on predictive (LL[1]) grammars.
The latest stable release with Haddock documentation is available on Hackage and development versions are available via the darcs repository.
Usage
Parsec lets you construct parsers by combining higher-order Combinators to create larger expressions. Combinator parsers are written and used within the same programming language as the rest of the program. The parsers are first-class citizens of the language , unlike Happy parsers, which must be generated via a preprocessor.
An example for parsing a simple grammar of expressions can be found here.
Much more documentation can be found on the parsec website.
This article is a stub. You can help by expanding it.
Examples
- "Using Parsec" chapter on Real World Haskell.
- Write Yourself a Scheme in 48 Hours/Parsing. Note, that where the example uses the read function, the Token module of Parsec could have been used, to handle numbers.
See also the list of reverse dependencies for Parsec.
Parsec clones in other languages
- PCL for O'Caml http://lprousnth.files.wordpress.com/2007/08/pcl.pdf
- JParsec for Java http://jparsec.codehaus.org/JParsec+Overview
- NParsec, JParsec ported to C# http://jparsec.codehaus.org/NParsec+Tutorial
- Ruby Parsec, JParsec ported to Ruby http://jparsec.codehaus.org/Ruby+Parsec
- FParsec for F# http://www.quanttec.com/fparsec/
- XParsec for F# http://corsis.github.com/XParsec/ is a type-and-source-polymorphic, generalized and extensible parsec implementation in F# 3.0 which supports powerful domain-specific non-linear navigation combinators (such as for XML trees)
- Parsec-Erlang, http://bitbucket.org/dmercer/parsec-erlang/ is a faithful reproduction of Parsec in Erlang (there is also an older toy Parsec-like parser that isn't monadic, nor does it give error messages: http://www.engr.uconn.edu/~jeffm/Source/Erlang/)
- AliceParsec for Alice ML http://www.ps.uni-sb.de/alice/contribs.html
- Parsnip for C++ http://parsnip-parser.sourceforge.net/
- Somewhere there is a Nemerle port
- Pysec for Python http://www.valuedlessons.com/2008/02/pysec-monadic-combinatoric-parsing-in.html
- JSParsec for JavaScript: http://code.google.com/p/jsparsec/
Interesting non-Parsec parser combinator libraries:
- Parse::RecDescent for Perl https://metacpan.org/module/Parse::RecDescent
- Spirit for C++ http://spirit.sourceforge.net/documentation.html
Links
Docs
- on Parsec website
- on Microsoft (content same as above)
Blog articles
- Adventures in parsing by Magnus Therning
- More adventures in parsing
- Adventures in parsing, part 3
- Adventures in parsing, part 4
- Adventures in Parsec by Antoine Latter
Other
- Parsec on Stack Overflow