megaparsec
Monadic parser combinators
https://github.com/mrkkrp/megaparsec
| Version on this page: | 4.0.0 |
| LTS Haskell 24.28: | 9.7.0@rev:1 |
| Stackage Nightly 2026-01-14: | 9.7.0@rev:1 |
| Latest on Hackage: | 9.7.0@rev:1 |
megaparsec-4.0.0@sha256:303ccd08a46a1f579017b7db24bf93f7bf9c8e96f5f5e9cb0bdfc23639675291,7240Module documentation for 4.0.0
This is industrial-strength monadic parser combinator library. Megaparsec is a fork of Parsec library originally written by Daan Leijen.
Megaparsec is different from Parsec in the following ways:
Better error messages. We test our error messages using dense QuickCheck 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 compiler or interpreter for some language.
Some quirks and “buggy features” (as well as plain bugs) of original Parsec are fixed. There is no undocumented surprising stuff in Megaparsec.
Better support for Unicode parsing in
Text.Megaparsec.Char.Megaparsec has more powerful combinators and can parse languages where indentation matters.
Comprehensive QuickCheck test suite covering nearly 100% of our code.
We have benchmarks to detect performance regressions.
Better documentation, with 100% of functions covered, without typos and obsolete information, with working examples. Megaparsec's documentation is well-structured and doesn't contain things useless to end user.
Megaparsec's code is clearer and doesn't contain “magic” found in original Parsec.
Megaparsec looks into the future, it does not contain code that serves for compatibility purposes, it also requires more recent version of
base.
Changes
Megaparsec 4.0.0
General changes
-
Renamed
many1→someas well as other parsers that hadmany1part in their names. -
The following functions are now re-exported from
Control.Applicative:(<|>),many,some,optional. See #9. -
Introduced type class
MonadParsecin the style of MTL monad transformers. Eliminated built-in user state since it was not flexible enough and can be emulated via stack of monads. Now all tools in Megaparsec work with any instance ofMonadParsec, not only withParsecT. -
Added new function
parseMaybefor lightweight parsing where error messages (and thus file name) are not important and entire input should be parsed. For example it can be used when parsing of single number according to specification of its format is desired. -
Fixed bug with
notFollowedByalways succeeded with parsers that don’t consume input, see #6. -
Flipped order of arguments in the primitive combinator
label, see #21. -
Renamed
tokenPrim→token, removed oldtoken, becausetokenPrimis more general and originaltokenis little used. -
Made
tokenparser more powerful, now its second argument can returnEither [Message] ainstead ofMaybe a, so it can influence error message when parsing of token fails. See #29. -
Added new primitive combinator
hidden pwhich hides “expected” tokens in error message when parserpfails. -
Tab width is not hard-coded anymore. It can be manipulated via
getTabWidthandsetTabWidth. Default tab-width isdefaultTabWidth, which is 8.
Error messages
-
Introduced type class
ShowTokenand improved representation of characters and stings in error messages, see #12. -
Greatly improved quality of error messages. Fixed entire
Text.Megaparsec.Errormodule, see #14 for more information. Made possible normal analysis of error messages without “render and re-parse” approach that previous maintainers had to practice to write even simplest tests, see moduleUtils.hsinold-testsfor example. -
Reduced number of
Messageconstructors (now there are onlyUnexpected,Expected, andMessage). Empty “magic” message strings are ignored now, all the library now uses explicit error messages. -
Introduced hint system that greatly improves quality of error messages and made code of
Text.Megaparsec.Prima lot clearer.
Built-in combinators
-
All built-in combinators in
Text.Megaparsec.Combinatornow work with any instance ofAlternative(some of them even withApplicaitve). -
Added more powerful
count'parser. This parser can be told to parse frommtonoccurrences of some thing.countis defined in terms ofcount'. -
Removed
optionMaybeparser, becauseoptionalfromControl.Applicativedoes the same thing. -
Added combinator
someTill. -
These combinators are considered deprecated and will be removed in future:
chainlchainl1chainrchainr1sepEndBysepEndBy1
Character parsing
-
Renamed some parsers:
alphaNum→alphaNumChardigit→digitCharendOfLine→eolhexDigit→hexDigitCharletter→letterCharlower→lowerCharoctDigit→octDigitCharspace→spaceCharspaces→spaceupper→upperChar
-
Added new character parsers in
Text.Megaparsec.Char:asciiCharcharCategorycontrolCharlatin1CharmarkCharnumberCharprintCharpunctuationCharseparatorCharsymbolChar
-
Descriptions of old parsers have been updated to accent some Unicode-specific moments. For example, old description of
letterstated that it parses letters from “a” to “z” and from “A” to “Z”. This is wrong, since it usedData.Char.isAlphapredicate internally and thus parsed many more characters (letters of non-Latin languages, for example). -
Added combinators
char',oneOf',noneOf', andstring'which are case-insensitive variants ofchar,oneOf,noneOf, andstringrespectively.
Lexer
-
Rewritten parsing of numbers, fixed #2 and #3 (in old Parsec project these are number 35 and 39 respectively), added per bug tests.
-
Since Haskell report doesn’t say anything about sign,
integerandfloatnow parse numbers without sign. -
Removed
naturalparser, it’s equal to newintegernow. -
Renamed
naturalOrFloat→number— this doesn’t parse sign too. -
Added new combinator
signedto parse all sorts of signed numbers.
-
-
Transformed
Text.Parsec.TokenintoText.Megaparsec.Lexer. Little of Parsec’s code remains in the new lexer module. New module doesn’t impose any assumptions on user and should be vastly more useful and general. Hairy stuff from original Parsec didn’t get here, for example built-in Haskell functions are used to parse escape sequences and the like instead of trying to re-implement the whole thing.
Other
-
Renamed the following functions:
permute→makePermParserbuildExpressionParser→makeExprParser
-
Added comprehensive QuickCheck test suite.
-
Added benchmarks.
Parsec 3.1.9
-
Many and various updates to documentation and package description (including the homepage links).
-
Add an
Eqinstance forParseError. -
Fixed a regression from 3.1.6:
runPis again exported from moduleText.Parsec.
Parsec 3.1.8
- Fix a regression from 3.1.6 related to exports from the main module.
Parsec 3.1.7
-
Fix a regression from 3.1.6 related to the reported position of error messages. See bug #9 for details.
-
Reset the current error position on success of
lookAhead.
Parsec 3.1.6
-
Export
Textinstances fromText.Parsec. -
Make
Text.Parsecexports more visible. -
Re-arrange
Text.Parsecexports. -
Add functions
crlfandendOfLinetoText.Parsec.Charfor handling input streams that do not have normalized line terminators. -
Fix off-by-one error in
Token.charControl.
Parsec 3.1.4 & 3.1.5
- Bump dependency on
text.
Parsec 3.1.3
- Fix a regression introduced in 3.1.2 related to positions reported by error messages.