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)
|
2020-07-10 23:41:12 +03:00
|
|
|
|
![CI](https://github.com/mrkkrp/megaparsec/workflows/CI/badge.svg?branch=master)
|
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)
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* [External lexers](#external-lexers)
|
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
|
|
|
|
* [Contribution](#contribution)
|
|
|
|
|
* [License](#license)
|
|
|
|
|
|
2015-10-17 11:06:10 +03:00
|
|
|
|
This is an industrial-strength monadic parser combinator library. Megaparsec
|
2019-10-19 21:37:04 +03:00
|
|
|
|
is a feature-rich package that tries to find a nice balance between speed,
|
2017-12-30 20:33:45 +03:00
|
|
|
|
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.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Most features work with all instances of `MonadParsec`. One can 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, one can also 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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Megaparsec includes all functionality that is typically available in
|
2019-10-19 21:37:04 +03:00
|
|
|
|
Parsec-like libraries and also features some special combinators:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* `parseError` allows us to end parsing and report an arbitrary parse error.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* `withRecovery` can be used to recover from parse errors “on-the-fly” and
|
2016-02-12 19:12:30 +03:00
|
|
|
|
continue parsing. Once parsing is finished, several parse errors may be
|
|
|
|
|
reported or ignored altogether.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* `observing` makes it possible to “observe” parse errors without ending
|
2019-11-07 15:08:42 +03:00
|
|
|
|
parsing.
|
2016-10-03 12:45:03 +03:00
|
|
|
|
|
2018-09-03 18:15:54 +03:00
|
|
|
|
In addition to that, Megaparsec features high-performance combinators
|
2018-11-06 19:04:10 +03:00
|
|
|
|
similar to those found in [Attoparsec][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`
|
2018-11-06 19:04:10 +03:00
|
|
|
|
without 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.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* `takeP` allows us to grab n tokens from the stream and returns them as a
|
2017-07-03 15:34:53 +03:00
|
|
|
|
“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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
The library 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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* `String = [Char]`
|
2015-10-10 17:14:48 +03:00
|
|
|
|
* `ByteString` (strict and lazy)
|
|
|
|
|
* `Text` (strict and lazy)
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
It's also possible to make it work with custom token streams by making them
|
|
|
|
|
an instance of the `Stream` type class.
|
2017-05-25 13:47:05 +03:00
|
|
|
|
|
2016-05-12 07:06:03 +03:00
|
|
|
|
### Error messages
|
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* Megaparsec has typed error messages and the ability to signal custom parse
|
2021-04-25 16:49:13 +03:00
|
|
|
|
errors that better suit the user's domain of interest.
|
2019-11-07 15:08:42 +03:00
|
|
|
|
|
2021-04-25 16:49:13 +03:00
|
|
|
|
* Since version 8, the location of parse errors can independent of current
|
2019-11-07 15:08:42 +03:00
|
|
|
|
offset in the input stream. It is useful when you want a parse error to
|
|
|
|
|
point to a particular position after performing some checks.
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
2021-04-25 16:49:13 +03:00
|
|
|
|
* Instead of a single parse error Megaparsec produces so-called
|
2019-11-07 15:08:42 +03:00
|
|
|
|
`ParseErrorBundle` data type that helps to manage multi-error messages and
|
2021-04-25 16:49:13 +03:00
|
|
|
|
pretty-print them. Since version 8, reporting multiple parse errors at
|
|
|
|
|
once has become easier.
|
2018-07-15 16:07:48 +03:00
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
### External lexers
|
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.
|
2019-11-07 15:08:42 +03:00
|
|
|
|
The design of the `Stream` type class has been changed significantly in the
|
|
|
|
|
recent versions, but user can still work with custom streams of tokens.
|
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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
for character parsing live in the [`Text.Megaparsec.Char`][tm-char] module.
|
|
|
|
|
Similarly, there is [`Text.Megaparsec.Byte`][tm-byte] module for parsing
|
|
|
|
|
streams of bytes.
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2015-10-10 17:14:48 +03:00
|
|
|
|
### Lexer
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[`Text.Megaparsec.Char.Lexer`][tm-char-lexer] is a module that should help
|
|
|
|
|
you write your lexer. If you have used `Parsec` in the past, this module
|
|
|
|
|
“fixes” its particularly inflexible `Text.Parsec.Token`.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[`Text.Megaparsec.Char.Lexer`][tm-char-lexer] is intended to be imported
|
|
|
|
|
using a qualified import, it's not included in [`Text.Megaparsec`][tm]. 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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
The design of the module allows one quickly solve simple tasks and doesn't
|
|
|
|
|
get in the way when the need to implement something less standard arises.
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[`Text.Megaparsec.Byte.Lexer`][tm-byte-lexer] is also available for users
|
|
|
|
|
who wish to parse binary data.
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
documentation on Hackage][hackage].
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
|
|
|
|
## Tutorials
|
|
|
|
|
|
2019-11-07 15:16:39 +03:00
|
|
|
|
You can find the most complete Megaparsec tutorial [here][the-tutorial]. It
|
|
|
|
|
should provide sufficient guidance to help you start with your parsing
|
2021-04-25 16:49:13 +03:00
|
|
|
|
tasks.
|
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
|
2019-11-07 15:08:42 +03:00
|
|
|
|
compares to [Attoparsec][attoparsec] (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
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
You can run the benchmarks yourself by executing:
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
```
|
2019-12-26 06:27:38 +03:00
|
|
|
|
$ nix-build -A benches.parsers-bench
|
2019-11-07 15:08:42 +03:00
|
|
|
|
$ cd result/bench
|
|
|
|
|
$ ./bench-memory
|
|
|
|
|
$ ./bench-speed
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
More information about benchmarking and development can be found
|
|
|
|
|
[here][hacking].
|
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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[Attoparsec][attoparsec] is another prominent Haskell library for parsing.
|
|
|
|
|
Although both libraries deal with parsing, it's usually easy to decide which
|
|
|
|
|
you will need in particular project:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
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
|
2021-04-25 16:49:13 +03:00
|
|
|
|
texts. It has better error messages and it's implemented as a monad
|
2015-10-10 17:14:48 +03:00
|
|
|
|
transformer.
|
|
|
|
|
|
2021-04-25 16:49:13 +03:00
|
|
|
|
So, if you work with something human-readable where the size of input data
|
|
|
|
|
is moderate, it makes sense to go with Megaparsec, otherwise Attoparsec may
|
|
|
|
|
be a better choice.
|
2017-07-02 19:56:01 +03:00
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Parsec
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Since Megaparsec is a fork of [Parsec][parsec], we are bound to list the
|
|
|
|
|
main differences between the two libraries:
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* Better error messages. Megaparsec has typed error messages and custom
|
|
|
|
|
error messages, it can also report multiple parse errors at once.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* Megaparsec can show the line on which parse error happened as part of
|
2018-01-11 16:37:50 +03:00
|
|
|
|
parse error. This makes it a lot easier to figure out where the error
|
|
|
|
|
happened.
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
2019-10-19 21:37:04 +03:00
|
|
|
|
* Some quirks and bugs of Parsec are fixed.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* Better support for Unicode parsing in [`Text.Megaparsec.Char`][tm-char].
|
2015-08-17 20:08:17 +03:00
|
|
|
|
|
|
|
|
|
* Megaparsec has more powerful combinators and can parse languages where
|
2021-04-25 16:49:13 +03:00
|
|
|
|
indentation matters.
|
2015-08-17 20:08:17 +03:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* Better documentation.
|
2016-05-12 07:06:03 +03:00
|
|
|
|
|
|
|
|
|
* Megaparsec can recover from parse errors “on the fly” and continue
|
|
|
|
|
parsing.
|
|
|
|
|
|
2021-04-25 16:49:13 +03:00
|
|
|
|
* Megaparsec allows us to conditionally process parse errors inside a
|
|
|
|
|
running parser. 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.
|
2017-05-25 13:47:05 +03:00
|
|
|
|
|
2019-10-19 21:37:04 +03:00
|
|
|
|
* Megaparsec is faster and supports efficient operations `tokens`,
|
|
|
|
|
`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.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Also see [this original announcement][original-announcement] for another
|
|
|
|
|
comparison.
|
2015-09-21 18:42:10 +03:00
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Trifecta
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[Trifecta][trifecta] is another Haskell library featuring good error
|
2019-10-19 21:37:04 +03:00
|
|
|
|
messages. These are the common reasons why Trifecta may be problematic to
|
|
|
|
|
use:
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
|
|
|
|
* Complicated, doesn't have any tutorials available, and documentation
|
2021-04-25 16:49:13 +03:00
|
|
|
|
doesn't help much.
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
|
|
|
|
* Trifecta can parse `String` and `ByteString` natively, but not `Text`.
|
|
|
|
|
|
2019-10-19 21:37:04 +03:00
|
|
|
|
* Depends on `lens`, which is a very heavy dependency. If you're not into
|
2021-04-25 16:49:13 +03:00
|
|
|
|
`lens`, you may not like the API.
|
2017-02-16 19:26:35 +03:00
|
|
|
|
|
2019-10-19 21:37:04 +03:00
|
|
|
|
[Idris][idris] has switched from Trifecta to Megaparsec which allowed it to
|
|
|
|
|
[have better error messages and fewer dependencies][idris-testimony].
|
2018-01-11 16:37:50 +03:00
|
|
|
|
|
2017-02-16 19:26:35 +03:00
|
|
|
|
### Megaparsec vs Earley
|
|
|
|
|
|
2019-10-19 21:37:04 +03:00
|
|
|
|
[Earley][earley] is a newer library that allows us to safely parse
|
|
|
|
|
context-free grammars (CFG). Megaparsec is a lower-level library compared to
|
|
|
|
|
Earley, but there are still enough reasons to choose it:
|
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
|
2019-10-19 21:37:04 +03:00
|
|
|
|
state. Even if your grammar is context-free, state may allow for
|
|
|
|
|
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.
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
In other words, 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).
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* [`replace-megaparsec`](https://hackage.haskell.org/package/replace-megaparsec)—Stream
|
|
|
|
|
editing and find-and-replace with Megaparsec.
|
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-11-06 19:04:10 +03:00
|
|
|
|
Some prominent projects that use Megaparsec:
|
2018-01-11 16:37:50 +03:00
|
|
|
|
|
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
|
2019-10-19 21:53:54 +03:00
|
|
|
|
* [Dhall](https://github.com/dhall-lang/dhall-haskell)—an advanced
|
|
|
|
|
configuration language
|
|
|
|
|
* [hnix](https://github.com/haskell-nix/hnix)—re-implementation of the Nix
|
|
|
|
|
language in Haskell
|
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
|
2017-07-25 18:18:45 +03:00
|
|
|
|
|
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:
|
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
* [Megaparsec 8](https://markkarpov.com/post/megaparsec-8.html)
|
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)
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* [The original Megaparsec 4.0.0 announcement][original-announcement]
|
2017-01-16 17:29:16 +03:00
|
|
|
|
|
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
|
2019-10-19 21:37:04 +03:00
|
|
|
|
[the GitHub issue tracker for this
|
|
|
|
|
project](https://github.com/mrkkrp/megaparsec/issues).
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
2019-11-07 15:08:42 +03:00
|
|
|
|
Pull requests are also welcome. If you would like to contribute to the
|
|
|
|
|
project, you may find [this document][hacking] helpful.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
2019-07-02 22:41:24 +03:00
|
|
|
|
Copyright © 2015–present Megaparsec contributors\
|
2018-01-11 16:37:50 +03:00
|
|
|
|
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.
|
2018-11-06 19:04:10 +03:00
|
|
|
|
|
|
|
|
|
[hackage]: https://hackage.haskell.org/package/megaparsec
|
2019-11-23 01:16:51 +03:00
|
|
|
|
[the-tutorial]: https://markkarpov.com/tutorial/megaparsec.html
|
2019-11-07 15:08:42 +03:00
|
|
|
|
[hacking]: ./HACKING.md
|
2018-11-06 19:04:10 +03:00
|
|
|
|
|
|
|
|
|
[tm]: https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec.html
|
|
|
|
|
[tm-char]: https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Char.html
|
|
|
|
|
[tm-byte]: https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Byte.html
|
|
|
|
|
[tm-char-lexer]: https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Char-Lexer.html
|
|
|
|
|
[tm-byte-lexer]: https://hackage.haskell.org/package/megaparsec/docs/Text-Megaparsec-Byte-Lexer.html
|
|
|
|
|
|
|
|
|
|
[attoparsec]: https://hackage.haskell.org/package/attoparsec
|
|
|
|
|
[parsec]: https://hackage.haskell.org/package/parsec
|
|
|
|
|
[trifecta]: https://hackage.haskell.org/package/trifecta
|
|
|
|
|
[earley]: https://hackage.haskell.org/package/Earley
|
|
|
|
|
[idris]: https://www.idris-lang.org/
|
|
|
|
|
[idris-testimony]: https://twitter.com/edwinbrady/status/950084043282010117?s=09
|
|
|
|
|
|
|
|
|
|
[parsers-bench]: https://github.com/mrkkrp/parsers-bench
|
|
|
|
|
[fast-parser]: https://markkarpov.com/megaparsec/writing-a-fast-parser.html
|
|
|
|
|
[original-announcement]: https://mail.haskell.org/pipermail/haskell-cafe/2015-September/121530.html
|