2015-08-01 19:24:45 +03:00
|
|
|
|
# Megaparsec
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-10-30 14:26:45 +03:00
|
|
|
|
[![License FreeBSD](https://img.shields.io/badge/license-FreeBSD-brightgreen.svg)](http://opensource.org/licenses/BSD-2-Clause)
|
2015-09-21 18:42:10 +03:00
|
|
|
|
[![Hackage](https://img.shields.io/hackage/v/megaparsec.svg?style=flat)](https://hackage.haskell.org/package/megaparsec)
|
2015-10-30 14:53:04 +03:00
|
|
|
|
[![Stackage Nightly](http://stackage.org/package/megaparsec/badge/nightly)](http://stackage.org/nightly/package/megaparsec)
|
2016-01-22 10:12:22 +03:00
|
|
|
|
[![Stackage LTS](http://stackage.org/package/megaparsec/badge/lts)](http://stackage.org/lts/package/megaparsec)
|
2015-07-27 12:12:29 +03:00
|
|
|
|
[![Build Status](https://travis-ci.org/mrkkrp/megaparsec.svg?branch=master)](https://travis-ci.org/mrkkrp/megaparsec)
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
* [Features](#features)
|
2015-10-18 13:39:07 +03:00
|
|
|
|
* [Core features](#core-features)
|
2016-05-12 07:06:03 +03:00
|
|
|
|
* [Error messages](#error-messages)
|
2017-08-15 14:08:52 +03:00
|
|
|
|
* [Alex support](#alex-support)
|
2018-01-11 16:37:50 +03:00
|
|
|
|
* [Character and binary parsing](#character-and-binary-parsing)
|
2015-10-18 13:39:07 +03:00
|
|
|
|
* [Lexer](#lexer)
|
2015-10-10 17:14:48 +03:00
|
|
|
|
* [Documentation](#documentation)
|
|
|
|
|
* [Tutorials](#tutorials)
|
2016-05-12 07:06:03 +03:00
|
|
|
|
* [Performance](#performance)
|
2015-10-10 17:14:48 +03:00
|
|
|
|
* [Comparison with other solutions](#comparison-with-other-solutions)
|
2017-02-16 19:26:35 +03:00
|
|
|
|
* [Megaparsec vs Attoparsec](#megaparsec-vs-attoparsec)
|
|
|
|
|
* [Megaparsec vs Parsec](#megaparsec-vs-parsec)
|
|
|
|
|
* [Megaparsec vs Trifecta](#megaparsec-vs-trifecta)
|
|
|
|
|
* [Megaparsec vs Earley](#megaparsec-vs-earley)
|
2016-01-24 17:57:04 +03:00
|
|
|
|
* [Related packages](#related-packages)
|
2017-07-25 18:18:45 +03:00
|
|
|
|
* [Prominent projects that use Megaparsec](#prominent-projects-that-use-megaparsec)
|
2017-07-06 12:32:05 +03:00
|
|
|
|
* [Links to announcements and blog posts](#links-to-announcements-and-blog-posts)
|
2015-10-10 17:14:48 +03:00
|
|
|
|
* [Authors](#authors)
|
|
|
|
|
* [Contribution](#contribution)
|
|
|
|
|
* [License](#license)
|
|
|
|
|
|
2015-10-17 11:06:10 +03:00
|
|
|
|
This is an industrial-strength monadic parser combinator library. Megaparsec
|
2017-12-30 20:33:45 +03:00
|
|
|
|
is a feature-rich package that strikes a nice balance between speed,
|
|
|
|
|
flexibility, and quality of parse errors.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
## Features
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
The project provides flexible solutions to satisfy common parsing needs. The
|
|
|
|
|
section describes them shortly. If you're looking for comprehensive
|
2017-05-25 13:47:05 +03:00
|
|
|
|
documentation, see the [section about documentation](#documentation).
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
### Core features
|
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
The package is built around `MonadParsec`, an MTL-style monad transformer.
|
|
|
|
|
All tools and features work with all instances of `MonadParsec`. You can
|
2018-01-11 16:37:50 +03:00
|
|
|
|
achieve various effects combining monad transformers, i.e. building a
|
|
|
|
|
monadic stack. Since the common monad transformers like `WriterT`, `StateT`,
|
|
|
|
|
`ReaderT` and others are instances of the `MonadParsec` type class, you can
|
|
|
|
|
wrap `ParsecT` *in* these monads, achieving, for example, backtracking
|
|
|
|
|
state.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
On the other hand `ParsecT` is an instance of many type classes as well. The
|
2015-10-17 11:06:10 +03:00
|
|
|
|
most useful ones are `Monad`, `Applicative`, `Alternative`, and
|
|
|
|
|
`MonadParsec`.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2017-07-02 19:56:01 +03:00
|
|
|
|
Megaparsec includes all functionality that is available in Parsec plus
|
|
|
|
|
features some combinators that are missing in other parsing libraries:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2017-06-29 08:13:22 +03:00
|
|
|
|
* `failure` allows to fail reporting a parse error with unexpected and
|
|
|
|
|
expected items.
|
|
|
|
|
* `fancyFailure` allows to fail reporting custom error messages.
|
2016-02-12 19:12:30 +03:00
|
|
|
|
* `withRecovery` allows to recover from parse errors “on-the-fly” and
|
|
|
|
|
continue parsing. Once parsing is finished, several parse errors may be
|
|
|
|
|
reported or ignored altogether.
|
2016-10-03 12:45:03 +03:00
|
|
|
|
* `observing` allows to “observe” parse errors without ending parsing (they
|
|
|
|
|
are returned in `Left`, while normal results are wrapped in `Right`).
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
In addition to that, Megaparsec features high-performance combinators
|
2017-07-02 19:56:01 +03:00
|
|
|
|
similar to those found in Attoparsec:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2017-07-03 14:34:00 +03:00
|
|
|
|
* `tokens` makes it easy to parse several tokens in a row (`string` and
|
|
|
|
|
`string'` are built on top of this primitive). This is about 100 times
|
|
|
|
|
faster than matching a string token by token. `tokens` returns “chunk” of
|
|
|
|
|
original input, meaning that if you parse `Text`, it'll return `Text`
|
|
|
|
|
without any repacking.
|
2017-07-02 19:56:01 +03:00
|
|
|
|
* `takeWhile` and `takeWhile1` are about 150 times faster than approaches
|
|
|
|
|
involving `many`, `manyTill` and other similar combinators.
|
2017-07-03 15:34:53 +03:00
|
|
|
|
* `takeP` allows to grab n tokens from the stream and returns them as a
|
|
|
|
|
“chunk” of the stream.
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
Megaparsec is about as fast as Attoparsec if you write your parser carefully
|
|
|
|
|
(see also [the section about performance](#performance)).
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2016-10-12 12:33:01 +03:00
|
|
|
|
Megaparsec can currently work with the following types of input stream
|
2017-05-25 13:47:05 +03:00
|
|
|
|
out-of-the-box:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
* `String` = `[Char]`
|
|
|
|
|
* `ByteString` (strict and lazy)
|
|
|
|
|
* `Text` (strict and lazy)
|
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
It's also simple to make it work with custom token streams, and Megaparsec
|
2018-01-11 16:37:50 +03:00
|
|
|
|
users have done so many times.
|
2017-05-25 13:47:05 +03:00
|
|
|
|
|
2016-05-12 07:06:03 +03:00
|
|
|
|
### Error messages
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
Megaparsec has well-typed error messages and the ability to use custom data
|
|
|
|
|
types to adjust the library to specific domain of interest. No need to use a
|
|
|
|
|
shapeless bunch of strings.
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2018-07-15 16:07:48 +03:00
|
|
|
|
Megaparsec 7 introduced the `ParseErrorBundle` data type that helps to
|
|
|
|
|
manage multi-error messages and pretty-print them easily and efficiently.
|
|
|
|
|
That version of the library also made the practice of displaying offending
|
|
|
|
|
line the default.
|
|
|
|
|
|
2017-08-15 14:08:52 +03:00
|
|
|
|
### Alex support
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2017-08-15 14:08:52 +03:00
|
|
|
|
Megaparsec works well with streams of tokens produced by tools like Alex.
|
|
|
|
|
The design of the `Stream` type class has been changed significantly in
|
2018-09-03 18:15:54 +03:00
|
|
|
|
versions 6 and 7, but user can still work with custom streams of tokens
|
|
|
|
|
without problems.
|
2017-07-02 19:56:01 +03:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
### Character and binary parsing
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
Megaparsec has decent support for Unicode-aware character parsing. Functions
|
2017-05-25 13:47:05 +03:00
|
|
|
|
for character parsing live in the
|
2018-01-11 16:37:50 +03:00
|
|
|
|
[`Text.Megaparsec.Char`](https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Char.html)
|
|
|
|
|
module. Similarly, there is
|
|
|
|
|
[`Text.Megaparsec.Byte`](https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Byte.html)
|
|
|
|
|
module for parsing streams of bytes.
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
### Lexer
|
|
|
|
|
|
2017-07-25 18:18:45 +03:00
|
|
|
|
[`Text.Megaparsec.Char.Lexer`](https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Char-Lexer.html)
|
2015-10-16 21:29:14 +03:00
|
|
|
|
is a module that should help you write your lexer. If you have used `Parsec`
|
2015-10-10 17:45:27 +03:00
|
|
|
|
in the past, this module “fixes” its particularly inflexible
|
|
|
|
|
`Text.Parsec.Token`.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
`Text.Megaparsec.Char.Lexer` is intended to be imported using a qualified
|
2017-07-25 18:18:45 +03:00
|
|
|
|
import, it's not included in `Text.Megaparsec`. The module doesn't impose
|
|
|
|
|
how you should write your parser, but certain approaches may be more elegant
|
|
|
|
|
than others. An especially important theme is parsing of white space,
|
|
|
|
|
comments, and indentation.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2015-10-17 11:06:10 +03:00
|
|
|
|
The design of the module allows you quickly solve simple tasks and doesn't
|
2015-12-30 12:17:37 +03:00
|
|
|
|
get in your way when you want to implement something less standard.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2016-05-14 12:59:18 +03:00
|
|
|
|
Since Megaparsec 5, all tools for indentation-sensitive parsing are
|
2017-07-25 18:18:45 +03:00
|
|
|
|
available in `Text.Megaparsec.Char.Lexer` module—no third party packages
|
2016-05-14 12:59:18 +03:00
|
|
|
|
required.
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2017-07-25 18:18:45 +03:00
|
|
|
|
`Text.Megaparsec.Byte.Lexer` is also available for users who wish to parse
|
|
|
|
|
binary data.
|
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
## Documentation
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
Megaparsec is well-documented. See the [current version of Megaparsec
|
|
|
|
|
documentation on Hackage](https://hackage.haskell.org/package/megaparsec).
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
## Tutorials
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
You can find Megaparsec tutorials
|
2017-06-08 13:32:09 +03:00
|
|
|
|
[here](https://markkarpov.com/learn-haskell.html#megaparsec-tutorials). They
|
|
|
|
|
should provide sufficient guidance to help you to start with your parsing
|
|
|
|
|
tasks. The site also has instructions and tips for Parsec users who decide
|
|
|
|
|
to migrate to Megaparsec.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2016-05-12 07:06:03 +03:00
|
|
|
|
## Performance
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
Despite being flexible, Megaparsec is also fast. Here is how Megaparsec
|
|
|
|
|
7.0.0 compares to Attoparsec 0.13.2.2 (the fastest widely used parsing
|
|
|
|
|
library in the Haskell ecosystem):
|
2018-01-11 16:37:50 +03:00
|
|
|
|
|
|
|
|
|
Test case | Execution time | Allocated | Max residency
|
|
|
|
|
------------------|---------------:|----------:|-------------:
|
2018-09-03 18:15:54 +03:00
|
|
|
|
CSV (Attoparsec) | 76.50 μs | 397,784 | 10,544
|
|
|
|
|
CSV (Megaparsec) | 64.69 μs | 352,408 | 9,104
|
|
|
|
|
Log (Attoparsec) | 302.8 μs | 1,150,032 | 10,912
|
|
|
|
|
Log (Megaparsec) | 337.8 μs | 1,246,496 | 10,912
|
|
|
|
|
JSON (Attoparsec) | 18.20 μs | 128,368 | 9,032
|
|
|
|
|
JSON (Megaparsec) | 25.45 μs | 203,824 | 9,176
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
The benchmarks were created to guide development of Megaparsec 6 and can be
|
|
|
|
|
found [here](https://github.com/mrkkrp/parsers-bench).
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
If you think your Megaparsec parser is not efficient enough, take a look at
|
|
|
|
|
[these
|
|
|
|
|
instructions](https://markkarpov.com/megaparsec/writing-a-fast-parser.html).
|
2016-09-18 21:18:27 +03:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
## Comparison with other solutions
|
|
|
|
|
|
|
|
|
|
There are quite a few libraries that can be used for parsing in Haskell,
|
|
|
|
|
let's compare Megaparsec with some of them.
|
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Attoparsec
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
[Attoparsec](https://github.com/bos/attoparsec) is another prominent Haskell
|
|
|
|
|
library for parsing. Although the both libraries deal with parsing, it's
|
|
|
|
|
usually easy to decide which you will need in particular project:
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
* *Attoparsec* is sometimes faster but not that feature-rich. It should be
|
|
|
|
|
used when you want to process large amounts of data where performance
|
|
|
|
|
matters more than quality of error messages.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
* *Megaparsec* is good for parsing of source code or other human-readable
|
|
|
|
|
texts. It has better error messages and it's implemented as monad
|
|
|
|
|
transformer.
|
|
|
|
|
|
|
|
|
|
So, if you work with something human-readable where size of input data is
|
|
|
|
|
usually not huge, just go with Megaparsec, otherwise Attoparsec may be a
|
|
|
|
|
better choice.
|
|
|
|
|
|
2017-07-02 19:56:01 +03:00
|
|
|
|
Since version 6, Megaparsec features the same fast primitives that
|
|
|
|
|
Attoparsec has, so in many cases the difference in speed is not that big.
|
|
|
|
|
Megaparsec now aims to be “one size fits all” ultimate solution to parsing,
|
|
|
|
|
so it can be used even to parse low-level binary formats.
|
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Parsec
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
Since Megaparsec is a fork of Parsec, we are bound to list the main
|
2015-10-10 17:14:48 +03:00
|
|
|
|
differences between the two libraries:
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
* Better error messages. We test our error messages using numerous
|
|
|
|
|
QuickCheck (generative) tests. Good error messages are just as important
|
|
|
|
|
for us as correct return values of our parsers. Megaparsec will be
|
|
|
|
|
especially useful if you write a compiler or an interpreter for some
|
|
|
|
|
language.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
* Megaparsec 6 can show the line on which parse error happened as part of
|
|
|
|
|
parse error. This makes it a lot easier to figure out where the error
|
|
|
|
|
happened.
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2015-08-17 20:08:17 +03:00
|
|
|
|
* Some quirks and “buggy features” (as well as plain bugs) of original
|
|
|
|
|
Parsec are fixed. There is no undocumented surprising stuff in Megaparsec.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-08-17 20:08:17 +03:00
|
|
|
|
* Better support for Unicode parsing in `Text.Megaparsec.Char`.
|
|
|
|
|
|
|
|
|
|
* Megaparsec has more powerful combinators and can parse languages where
|
2018-01-11 16:37:50 +03:00
|
|
|
|
indentation matters out-of-the-box.
|
2015-08-17 20:08:17 +03:00
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
* Comprehensive test suite covering nearly 100% of our code. Compare that to
|
|
|
|
|
absence
|
2015-07-30 19:04:33 +03:00
|
|
|
|
|
2015-08-17 20:08:17 +03:00
|
|
|
|
* We have benchmarks to detect performance regressions.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-08-17 20:08:17 +03:00
|
|
|
|
* Better documentation, with 100% of functions covered, without typos and
|
|
|
|
|
obsolete information, with working examples. Megaparsec's documentation is
|
2015-10-16 21:29:14 +03:00
|
|
|
|
well-structured and doesn't contain things useless to end users.
|
2015-08-17 20:08:17 +03:00
|
|
|
|
|
|
|
|
|
* Megaparsec's code is clearer and doesn't contain “magic” found in original
|
2015-08-26 14:47:22 +03:00
|
|
|
|
Parsec.
|
2015-08-17 20:08:17 +03:00
|
|
|
|
|
2016-05-12 07:06:03 +03:00
|
|
|
|
* Megaparsec has well-typed error messages and custom error messages.
|
|
|
|
|
|
|
|
|
|
* Megaparsec can recover from parse errors “on the fly” and continue
|
|
|
|
|
parsing.
|
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* Megaparsec allows to conditionally process parse errors *inside your
|
|
|
|
|
parser* before parsing is finished. In particular, it's possible to define
|
|
|
|
|
regions in which parse errors, should they happen, will get a “context
|
|
|
|
|
tag”, e.g. we could build a context stack like “in function definition
|
|
|
|
|
foo”, “in expression x”, etc. This is not possible with Parsec.
|
|
|
|
|
|
2017-07-02 19:56:01 +03:00
|
|
|
|
* Megaparsec is faster and supports efficient operations on top of `tokens`,
|
2018-01-11 16:37:50 +03:00
|
|
|
|
`takeWhileP`, `takeWhile1P`, `takeP` like Attoparsec.
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2015-10-16 21:29:14 +03:00
|
|
|
|
If you want to see a detailed change log, `CHANGELOG.md` may be helpful.
|
2016-09-18 21:20:37 +03:00
|
|
|
|
Also see [this original announcement](https://notehub.org/w7037) for another
|
|
|
|
|
comparison.
|
2015-09-21 18:42:10 +03:00
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Trifecta
|
|
|
|
|
|
|
|
|
|
[Trifecta](https://hackage.haskell.org/package/trifecta) is another Haskell
|
2017-06-29 08:13:22 +03:00
|
|
|
|
library featuring good error messages. It's probably good, but also
|
2018-01-11 16:37:50 +03:00
|
|
|
|
under-documented, and has unfixed [bugs and
|
|
|
|
|
flaws](https://github.com/ekmett/trifecta/issues). Other reasons one may
|
|
|
|
|
question choice of Trifecta is his/her parsing library:
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
|
|
|
|
* Complicated, doesn't have any tutorials available, and documentation
|
|
|
|
|
doesn't help at all.
|
|
|
|
|
|
|
|
|
|
* Trifecta can parse `String` and `ByteString` natively, but not `Text`.
|
|
|
|
|
|
|
|
|
|
* Trifecta's error messages may be different with their own features, but
|
|
|
|
|
certainly not as flexible as Megaparsec's error messages in the latest
|
|
|
|
|
versions.
|
|
|
|
|
|
|
|
|
|
* Depends on `lens`. This means you'll pull in half of Hackage as transitive
|
|
|
|
|
dependencies. Also if you're not into `lens` and would like to keep your
|
|
|
|
|
code “vanilla”, you may not like the API.
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
[Idris](https://www.idris-lang.org/) has recently switched from Trifecta to
|
|
|
|
|
Megaparsec which allowed it to [have better error messages and fewer
|
|
|
|
|
dependencies](https://twitter.com/edwinbrady/status/950084043282010117?s=09).
|
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Earley
|
|
|
|
|
|
|
|
|
|
[Earley](https://hackage.haskell.org/package/Earley) is a newer library that
|
|
|
|
|
allows to safely (it your code compiles, then it probably works) parse
|
|
|
|
|
context-free grammars (CFG). Megaparsec is a lower-level library compared to
|
2017-02-16 22:16:25 +03:00
|
|
|
|
Earley, but there are still enough reasons to choose it over Earley:
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
|
|
|
|
* Megaparsec is faster.
|
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* Your grammar may be not context-free or you may want introduce some sort
|
2017-02-16 19:26:35 +03:00
|
|
|
|
of state to the parsing process. Almost all non-trivial parsers require
|
|
|
|
|
something of this sort. Even if your grammar is context-free, state may
|
2017-02-16 22:16:25 +03:00
|
|
|
|
allow to add some additional niceties. Earley does not support that.
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
|
|
|
|
* Megaparsec's error messages are more flexible allowing to include
|
|
|
|
|
arbitrary data in them, return multiple error messages, mark regions that
|
|
|
|
|
affect any error that happens in those regions, etc.
|
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* The approach Earley uses differs from the conventional monadic parsing. If
|
2017-07-25 18:18:45 +03:00
|
|
|
|
you work not alone, people you work with, especially beginners, will be
|
|
|
|
|
much more productive with libraries taking more traditional path to
|
|
|
|
|
parsing like Megaparsec.
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
IOW, Megaparsec is less safe but also more powerful.
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
2016-01-24 17:57:04 +03:00
|
|
|
|
## Related packages
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
The following packages are designed to be used with Megaparsec (open a PR if
|
|
|
|
|
you want to add something to the list):
|
2016-01-24 17:57:04 +03:00
|
|
|
|
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* [`hspec-megaparsec`](https://hackage.haskell.org/package/hspec-megaparsec)—utilities
|
2018-01-11 16:37:50 +03:00
|
|
|
|
for testing Megaparsec parsers with with
|
|
|
|
|
[Hspec](https://hackage.haskell.org/package/hspec).
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* [`cassava-megaparsec`](https://hackage.haskell.org/package/cassava-megaparsec)—Megaparsec
|
2018-01-11 16:37:50 +03:00
|
|
|
|
parser of CSV files that plays nicely with
|
|
|
|
|
[Cassava](https://hackage.haskell.org/package/cassava).
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* [`tagsoup-megaparsec`](https://hackage.haskell.org/package/tagsoup-megaparsec)—a
|
2018-01-11 16:37:50 +03:00
|
|
|
|
library for easily using
|
|
|
|
|
[TagSoup](https://hackage.haskell.org/package/tagsoup) as a token type in
|
|
|
|
|
Megaparsec.
|
2016-01-24 17:57:04 +03:00
|
|
|
|
|
2017-07-25 18:18:45 +03:00
|
|
|
|
## Prominent projects that use Megaparsec
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
The following are some prominent projects that use Megaparsec:
|
|
|
|
|
|
2017-12-26 17:53:01 +03:00
|
|
|
|
* [Idris](https://github.com/idris-lang/Idris-dev)—a general-purpose
|
|
|
|
|
functional programming language with dependent types
|
2017-07-25 18:18:45 +03:00
|
|
|
|
* [Hledger](https://github.com/simonmichael/hledger)—an accounting tool
|
2018-01-11 16:37:50 +03:00
|
|
|
|
* [MMark](https://github.com/mmark-md/mmark)—strict markdown processor for
|
|
|
|
|
writers
|
|
|
|
|
* [Stache](https://github.com/stackbuilders/stache)—Mustache templates for
|
|
|
|
|
Haskell
|
2017-07-25 18:18:45 +03:00
|
|
|
|
* [Language Puppet](https://github.com/bartavelle/language-puppet)—library
|
|
|
|
|
for manipulating Puppet manifests
|
|
|
|
|
|
2017-07-06 12:32:05 +03:00
|
|
|
|
## Links to announcements and blog posts
|
2017-01-16 17:29:16 +03:00
|
|
|
|
|
|
|
|
|
Here are some blog posts mainly announcing new features of the project and
|
|
|
|
|
describing what sort of things are now possible:
|
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
* [Megaparsec 7](https://markkarpov.com/post/megaparsec-7.html)
|
2017-07-26 18:45:45 +03:00
|
|
|
|
* [Evolution of error messages](https://markkarpov.com/post/evolution-of-error-messages.html)
|
2017-07-06 12:32:05 +03:00
|
|
|
|
* [A major upgrade to Megaparsec: more speed, more power](https://markkarpov.com/post/megaparsec-more-speed-more-power.html)
|
2017-06-06 13:05:30 +03:00
|
|
|
|
* [Latest additions to Megaparsec](https://markkarpov.com/post/latest-additions-to-megaparsec.html)
|
|
|
|
|
* [Announcing Megaparsec 5](https://markkarpov.com/post/announcing-megaparsec-5.html)
|
|
|
|
|
* [Megaparsec 4 and 5](https://markkarpov.com/post/megaparsec-4-and-5.html)
|
2017-05-25 13:47:05 +03:00
|
|
|
|
* [The original Megaparsec 4.0.0 announcement](https://notehub.org/w7037)
|
2017-01-16 17:29:16 +03:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
## Authors
|
|
|
|
|
|
2015-10-18 11:37:19 +03:00
|
|
|
|
The project was started and is currently maintained by Mark Karpov. You can
|
2017-05-25 13:47:05 +03:00
|
|
|
|
find the complete list of contributors in the `AUTHORS.md` file in the
|
|
|
|
|
official repository of the project. Thanks to all the people who propose
|
|
|
|
|
features and ideas, although they are not in `AUTHORS.md`, without them
|
|
|
|
|
Megaparsec would not be that good.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
## Contribution
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
|
|
|
|
Issues (bugs, feature requests or otherwise feedback) may be reported in
|
2015-09-22 14:34:18 +03:00
|
|
|
|
[the GitHub issue tracker for this project](https://github.com/mrkkrp/megaparsec/issues).
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2015-09-22 14:34:18 +03:00
|
|
|
|
Pull requests are also welcome (and yes, they will get attention and will be
|
2017-05-25 13:47:05 +03:00
|
|
|
|
merged quickly if they are good).
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
2018-01-11 16:37:50 +03:00
|
|
|
|
Copyright © 2015–2018 Megaparsec contributors\
|
|
|
|
|
Copyright © 2007 Paolo Martini\
|
2015-07-31 14:44:27 +03:00
|
|
|
|
Copyright © 1999–2000 Daan Leijen
|
2015-07-27 12:00:41 +03:00
|
|
|
|
|
2015-10-30 14:26:45 +03:00
|
|
|
|
Distributed under FreeBSD license.
|