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
|
|
|
|
* [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.
|
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
|
|
|
|
|
Parsec-like libraries and also features some combinators that are quite
|
|
|
|
|
unique to it:
|
2015-10-10 17:14:48 +03:00
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* `failure` allows us to report a parse error with unexpected and expected
|
|
|
|
|
items.
|
|
|
|
|
* `fancyFailure` provides a way to report custom parse errors.
|
|
|
|
|
* `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
|
|
|
|
|
parsing (they are returned in `Left`, while normal results are wrapped in
|
|
|
|
|
`Right`).
|
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
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Megaparsec has well-typed error messages and the ability to signal custom
|
|
|
|
|
parse errors to better work in user's domain of interest.
|
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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
line the default, similar to how recent versions of GHC do it.
|
2018-07-15 16:07:48 +03:00
|
|
|
|
|
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
|
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
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
You can find Megaparsec tutorials [here][tutorials]. They should provide
|
|
|
|
|
sufficient guidance to help you 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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
7.0.0 compares to [Attoparsec][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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
found [here][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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[these instructions][fast-parser].
|
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
|
|
|
|
|
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
|
2018-11-06 19:04:10 +03:00
|
|
|
|
moderate, just 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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* Better error messages. Megaparsec has well-typed error messages and custom
|
|
|
|
|
error messages.
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
2018-01-11 16:37:50 +03:00
|
|
|
|
indentation matters out-of-the-box.
|
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.
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
* Megaparsec allows us to conditionally process parse errors *inside your
|
2017-05-25 13:47:05 +03:00
|
|
|
|
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.
|
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
|
|
|
|
|
messages. Some 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-11-06 19:04:10 +03:00
|
|
|
|
[Idris][idris] has recently 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
|
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
[Earley][earley] is a newer library that allows us to safely (it your code
|
|
|
|
|
compiles, then it probably works) 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
|
|
|
|
|
something of this sort. Even if your grammar is context-free, state may
|
2018-11-06 19:04:10 +03:00
|
|
|
|
allow us 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
|
|
|
|
|
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).
|
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
|
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)
|
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
|
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
|
|
|
|
|
2018-11-06 19:04:10 +03:00
|
|
|
|
Pull requests are also welcome.
|
2014-10-16 20:21:52 +04:00
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
2019-01-01 08:50:48 +03:00
|
|
|
|
Copyright © 2015–2019 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
|
|
|
|
|
[tutorials]: https://markkarpov.com/learn-haskell.html#megaparsec-tutorials
|
|
|
|
|
|
|
|
|
|
[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
|