1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
|
*Megaparsec follows [SemVer](https://semver.org/).*
## Megaparsec 9.5.0
* Dropped a number of redundant constraints here and there. [PR
523](https://github.com/mrkkrp/megaparsec/pull/523).
* Added a `MonadWriter` instance for `ParsecT`. [PR
534](https://github.com/mrkkrp/megaparsec/pull/534).
## Megaparsec 9.4.1
* Removed `Monad m` constraints in several places where they were introduced
in 9.4.0. [Issue 532](https://github.com/mrkkrp/megaparsec/issues/532).
## Megaparsec 9.4.0
* `dbg` now prints hints among other debug information. [PR
530](https://github.com/mrkkrp/megaparsec/pull/530).
* Hints are no longer lost in certain methods of MTL instances for
`ParsecT`. [Issue 528](https://github.com/mrkkrp/megaparsec/issues/528).
* Added a new method to the `MonadParsec` type class—`mkParsec`. This can be
used to construct “new primitives” with arbitrary behavior at the expense
of having to dive into Megaparsec's internals. [PR
514](https://github.com/mrkkrp/megaparsec/pull/514).
## Megaparsec 9.3.1
* Fixed a bug related to processing of tabs when error messages are
rendered. [Issue 524](https://github.com/mrkkrp/megaparsec/issues/524).
## Megaparsec 9.3.0
* Now `label` can override more than one group of hints in the parser it
wraps. [Issue 482](https://github.com/mrkkrp/megaparsec/issues/482).
* `takeP n` now returns the empty chunk of the input stream when `n` is
negative, similar to when `n == 0`. [Issue
497](https://github.com/mrkkrp/megaparsec/issues/497).
* Added the `MonadParsecDbg` type class in `Text.Megaparsec.Debug`. The type
class allows us to use `dbg` in MTL monad transformers. [Issue
488](https://github.com/mrkkrp/megaparsec/issues/488).
* Introduced the `ShareInput` and `NoShareInput` newtype wrappers in
`Text.Megaparsec.Stream` in order to allow the user to choose how the
input should be sliced and shared during the parsing. [Issue
492](https://github.com/mrkkrp/megaparsec/issues/492).
## Megaparsec 9.2.2
* Fixed a space leak in the implementations of the `reachOffset` and
`reachOffsetNoLine` methods of `TraversableStream`. [Issue
486](https://github.com/mrkkrp/megaparsec/issues/486).
## Megaparsec 9.2.1
* Builds with `mtl-2.3` and `transformers-0.6`.
## Megaparsec 9.2.0
* Added parsers for binary representations (little/big endian) of numbers in
`Text.Megaparsec.Byte.Binary`.
## Megaparsec 9.1.0
* Added `dbg'` in `Text.Megaparsec.Debug` for debugging parsers that have
unshowable return values.
* Documentation improvements.
## Megaparsec 9.0.1
* Added [Safe
Haskell](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/safe_haskell.html)
support.
## Megaparsec 9.0.0
* Split the `Stream` type class. The methods `showTokens` and `tokensLength`
have been put into a separate type class `VisualStream`, while
`reachOffset` and `reachOffsetNoLine` are now in `TraversableStream`. This
should make defining `Stream` instances for custom streams easier.
* Defined `Stream` instances for lists and `Seq`s.
* Added the functions `hspace` and `hspace1` to the `Text.Megaparsec.Char`
and `Text.Megaparsec.Byte` modules.
## Megaparsec 8.0.0
* The methods `failure` and `fancyFailure` of `MonadParsec` are now ordinary
functions and live in `Text.Megaparsec`. They are defined in terms of the
new `parseError` method of `MonadParsec`. This method allows us to signal
parse errors at a given offset without manipulating parser state manually.
* Megaparsec now supports registration of “delayed” parse errors. On lower
level we added a new field called `stateParseErrors` to the `State`
record. The type also had to change from `State s` to `State s e`. This
field contains the list of registered `ParseErrors` that do not end
parsing immediately but still will cause failure in the end if the list is
not empty. Users are expected to register parse errors using the three
functions: `registerParseError`, `registerFailure`, and
`registerFancyFailure`. These functions are analogous to those without the
`register` prefix, except that they have “delayed” effect.
* Added the `tokensLength` method to the `Stream` type class to improve
support for custom input streams.
* Added the `setErrorOffset` function to set offset of `ParseError`s.
* Changed type signatures of `reachOffset` and `reachOffsetNoLine` methods
of the `Stream` type class. Instead of three-tuple `reachOffset` now
returns two-tuple because `SourcePos` is already contained in the returned
`PosState` record.
* Generalized `decimal`, `binary`, `octal`, and `hexadecimal` parsers in
lexer modules so that they `Num` instead of just `Integral`.
* Dropped support for GHC 8.2.x and older.
## Megaparsec 7.0.5
* Dropped support for GHC 7.10.
* Adapted the code to `MonadFail` changes in `base-4.13`.
* Separated the test suite into its own package. The reason is that we can
avoid circular dependency on `hspec-megaparsec` and thus avoid keeping
copies of its source files in our test suite, as we had to do before.
Another benefit is that we can export some auxiliary functions in
`megaparsec-tests` which can be used by other test suites, for example in
the `parser-combinators-tests` package.
Version of `megaparsec-tests` will be kept in sync with versions of
`megaparsec` from now on.
## Megaparsec 7.0.4
* Numerous documentation corrections.
## Megaparsec 7.0.3
* Fixed the build with `mtl` older than `2.2.2`.
## Megaparsec 7.0.2
* Fixed the property test for `char'` which was failing in the case when
there is a character with different upper and title cases.
* More descriptive error messages when `elabel` or `ulabel` from
`Text.Megaparsec.Error.Builder` are used with empty strings.
* Typo fixes in the docs.
## Megaparsec 7.0.1
* Fixed a bug in `errorBundlePretty`. Previously the question sign `?` was
erroneously inserted before offending line in 2nd and later parse errors.
## Megaparsec 7.0.0
### General
* Dropped the `Text.Megaparsec.Perm` module. Use
`Control.Applicative.Permutations` from `parser-combinators` instead.
* Dropped the `Text.Megaparsec.Expr` module. Use
`Control.Monad.Combinators.Expr` from `parser-combinators` instead.
* The debugging function `dbg` has been moved from `Text.Megaparsec` to its
own module `Text.Megaparsec.Debug`.
* Dropped support for GHC 7.8.
### Combinators
* Moved some general combinators from `Text.Megaparsec.Char` and
`Text.Megaparsec.Byte` to `Text.Megaparsec`, renaming some of them for
clarity.
Practical consequences:
* Now there is the `single` combinator that is a generalization of `char`
for arbitrary streams. `Text.Megaparsec.Char` and `Text.Megaparsec.Byte`
still contain `char` as type-constrained versions of `single`.
* Similarly, now there is the `chunk` combinator that is a generalization
of `string` for arbitrary streams. The `string` combinator is still
re-exported from `Text.Megaparsec.Char` and `Text.Megaparsec.Byte` for
compatibility.
* `satisfy` does not depend on type of token, and so it now lives in
`Text.Megaparsec`.
* `anyChar` was renamed to `anySingle` and moved to `Text.Megaparsec`.
* `notChar` was renamed to `anySingleBut` and moved to `Text.Megaparsec`.
* `oneOf` and `noneOf` were moved to `Text.Megaparsec`.
* Simplified the type of the `token` primitive. It now takes just a matching
function `Token s -> Maybe a` as the first argument and the collection of
expected items `Set (ErrorItem (Token s))` as the second argument. This
makes sense because the collection of expected items cannot depend on what
we see in the input stream.
* The `label` primitive now doesn't prepend the phrase “the rest of” to the
label when its inner parser produces hints after consuming input. In that
case `label` has no effect.
* Fixed the `Text.Megaparsec.Char.Lexer.charLiteral` so it can accept longer
escape sequences (max length is now 10).
* Added the `binDigitChar` functions in `Text.Megaparsec.Byte` and
`Text.Megaparsec.Char`.
* Added the `binary` functions in `Text.Megaparsec.Byte.Lexer` and
`Text.Megaparsec.Char.Lexer`.
* Improved case-insensitive character matching in the cases when e.g.
`isLower` and `isUpper` both return `False`. Functions affected:
`Text.Megaparsec.Char.char'`.
* Renamed `getPosition` to `getSourcePos`.
* Renamed `getTokensProcessed` to `getOffset`, `setTokensProcessed` to
`setOffset`.
* Dropped `getTabWidth` and `setTabWidth` because tab width is irrelevant to
parsing process now, it's only relevant for pretty-printing of parse
errors, which is handled separately.
* Added and `withParsecT` in `Text.Megaparsec.Internal` to allow changing
the type of the custom data component in parse errors.
### Parser state and input stream
* Dropped stacks of source positions. Accordingly, the functions
`pushPosition` and `popPosition` from `Text.Megaparsec` and
`sourcePosStackPretty` from `Text.Megaparsec.Error` were removed. The
reason for this simplification is that I could not find any code that uses
the feature and it makes manipulation of source positions hairy.
* Introduced `PosState` for calculating `SourcePos` from offsets and getting
offending line for displaying on pretty-printing of parse errors. It's now
contained in both `State` and `ParseErrorBundle`.
* Dropped `positionAt1`, `positionAtN`, `advance1`, and `advanceN` methods
from `Stream`. They are no longer necessary because `reachOffset` (and its
specialized version `reachOffsetNoLine`) takes care of `SourcePos`
calculation.
### Parse errors
* `ParseError` now contains raw offset in input stream instead of
`SourcePos`. `errorPos` was dropped from `Text.Megaparsec.Error`.
* `ParseError` is now parametrized over stream type `s` instead of token
type `t`.
* Introduced `ParseErrorBundle` which contains one or more `ParseError`
equipped with all information that is necessary to pretty-print them
together with offending lines from the input stream. Functions like
`runParser` now return `ParseErrorBundle` instead of plain `ParseError`.
By default there will be only one `ParseError` in such a bundle, but it's
possible to add more parse errors to a bundle manually. During
pretty-printing, the input stream will be traversed only once.
* The primary function for pretty-printing of parse
errors—`errorBundlePretty` always prints offending lines now.
`parseErrorPretty` is still there, but it probably won't see a lot of use
from now on. `parseErrorPretty'` and `parseErrorPretty_` were removed.
`parseTest'` was removed because `parseTest` always prints offending lines
now.
* Added `attachSourcePos` function in `Text.Megaparsec.Error`.
* The `ShowToken` type class has been removed and its method `showTokens`
now lives in the `Stream` type class.
* The `LineToken` type class is no longer necessary because the new method
`reachOffset` of the type class `Stream` does its job.
* In `Text.Megaparsec.Error` the following functions were added:
`mapParseError`, `errorOffset`.
* Implemented continuous highlighting in parse errors. For this we added the
`errorComponentLen` method to the `ShowErrorComponent` type class.
### Parse error builder
* The functions `err` and `errFancy` now accept offsets at which the parse
errors are expected to have happened, i.e. `Int`s. Thus `posI` and `posN`
are no longer necessary and were removed.
* `ET` is now parametrized over the type of stream `s` instead of token type
`t`.
* Combinators like `utoks` and `etoks` now accept chunks of input stream
directly, i.e. `Tokens s` instead of `[Token s]` which should be more
natural and convenient.
## Megaparsec 6.5.0
* Added `Text.Megaparsec.Internal`, which exposes some internal data
structures and data constructor of `ParsecT`.
## Megaparsec 6.4.1
* `scientific` now correctly backtracks after attempting to parse fractional
and exponent parts of a number. `float` correctly backtracks after
attempting to parse optional exponent part (when it comes after fractional
part, otherwise it's obligatory).
## Megaparsec 6.4.0
* `Text.Megaparsec` now re-exports `Control.Monad.Combinators` instead of
`Control.Applicative.Combinators` from `parser-combinators` because the
monadic counterparts of the familiar combinators are more efficient and
not as leaky.
This may cause minor breakage in certain cases:
* You import `Control.Applicative` and in that case there will be a name
conflict between `Control.Applicative.many` and
`Control.Monad.Combinator.many` now (the same for `some`).
* You define a polymorphic helper in terms of combinator(s) from
`Control.Applicative.Combinators` and use `Applicative` or `Alternative`
constraint. In this case you'll have to adjust the constraint to be
`Monad` or `MonadPlus` respectively.
Also note that the new `Control.Monad.Combinators` module we re-export now
re-exports `empty` from `Control.Applicative`.
* Fix the `atEnd` parser. It now does not produce hints, so when you use it,
it won't contribute to the “expecting end of input” component of parse
error.
## Megaparsec 6.3.0
* Added an `IsString` instance for `ParsecT`. Now it is possible to
write `"abc"` rather than `string "abc"`.
* Added the `customFailure` combinator, which is a special case of
`fancyFailure`.
* Made implementation of `sconcat` and `mconcat` of `ParsecT` more
efficient.
## Megaparsec 6.2.0
* `float` in `Text.Megaparsec.Char.Lexer` and `Text.Megaparsec.Byte.Lexer`
now does not accept plain integers. This is the behavior we had in version
5 of the library.
## Megaparsec 6.1.1
* Fixed the bug when `tokens` used `cok` continuation even when matching an
empty chunk. Now it correctly uses `eok` in this case.
## Megaparsec 6.1.0
* Improved rendering of offending line in `parseErrorPretty'` in the
presence of tab characters.
* Added `parseErrorPretty_`, which is just like `parseErrorPretty'` but
allows to specify tab width to use.
* Adjusted hint generation so when we backtrack a consuming parser with
`try`, we do not create hints from its parse error (because it's further
in input stream!). This was a quite subtle bug that stayed unnoticed for
several years apparently.
## Megaparsec 6.0.2
* Allow `parser-combinators-0.2.0`.
## Megaparsec 6.0.1
* Fixed a typo in `README.md`.
* Added some text that clarifies how to parametrize the `ParseError` type.
## Megaparsec 6.0.0
### General
* Re-organized the module hierarchy. Some modules such as
`Text.Megaparsec.Prim` do not exist anymore. Stream definitions were moved
to `Text.Megaparsec.Stream`. Generic combinators are now re-exported from
the `Control.Applicative.Combinators` from the package
`parser-combinators`. Just import `Text.Megaparsec` and you should be OK.
Add `Text.Megaparsec.Char` if you are working with a stream of `Char`s or
`Text.Megaparsec.Byte` if you intend to parse binary data, then add
qualified modules you need (permutation parsing, lexing, expression
parsing, etc.). `Text.Megaparsec.Lexer` was renamed to
`Text.Megaparsec.Char.Lexer` because many functions in it has the `Token s
~ Char` constraint. There is also `Text.Megaparsec.Byte.Lexer` now,
although it has fewer functions.
* Dropped per-stream modules, the `Parser` type synonym is to be defined
manually by user.
* Added a `MonadFix` instance for `ParsecT`.
* More lightweight dependency tree, dropped `exceptions` and `QuickCheck`
dependencies.
* Added dependency on `case-insensitive`.
### Source positions
* Now `Pos` contains an `Int` inside, not `Word`.
* Dropped `unsafePos` and changed type of `mkPos` so it throws from pure
code if its argument is not a positive `Int`.
* Added `pos1` constant that represents the `Pos` with value 1 inside.
* Made `InvalidPosException` contain the invalid `Int` value that was passed
to `mkPos`.
### Parse errors
* Changed the definition of `ParseError` to have separate data constructors
for “trivial” errors (unexpected/expected tokens) and “fancy” errors
(everything else).
* Removed the `ErrorComponent` type class, added `ErrorFancy` instead.
`ErrorFancy` is a sum type which can represent `fail` messages, incorrect
indentation, and custom data (we use `Void` for that by default to
“disable” it). This is better than the typeclass-based approach because
every instance of `ErrorComponent` needed to have constructors for `fail`
and indentation massages anyway, leading to duplication of code (for
example for parse error component rendering).
* Added `Functor` instances for `ErrorItem` and `ErrorFancy`.
* Added the function `errorPos` to get error positions from `ParseError`
(previously it was a record selector in `ParseError`).
* Control characters in parse error are displayed in a readable form even
when they are part of strings, for example: `{<newline>` (`{` followed by
the newline character). Previously control characters were rendered in
readable form only as standalone tokens.
* Added `Text.Megaparsec.Error.Builder` module to help construct
`ParseError`s easily. It is useful for testing and debugging. Previously
we had something like that in the `hspec-megaparsec` package, but it does
not hurt to ship it with the library.
* Added `parseErrorPretty'` allowing to display offending line in parse
errors.
* Added `LineToken` type class for tokens that support operations necessary
for selecting and displaying relevant line of input (used in
`parseErrorPretty'`).
* Added `parseTest'` function that is just like `parseTest`, but also prints
offending line in parse errors. This is powered by the new
`parseErrorPretty'`.
### Stream
* Introduced the new `Text.Megaparsec.Stream` module that is the home of
`Stream` type class. In version 6, the type class has been extended
significantly to improve performance and make some combinators more
general.
### Combinators
* Changed signatures of `failure` and `token`, they only can signal trivial
errors now.
* Added a new method of `MonadParsec` type class called `fancyFailure` for
signalling non-trivial failures. Signatures of some functions (`failure`,
`token`) have been changed accordingly.
* Added `takeWhileP`, `takeWhile1P` and `takeP` to `MonadParsec`.
* Added `takeRest` non-primitive combinator to consume the rest of input.
* Added `atEnd` which returns `True` when end of input has been reached.
* Dropped `oneOf'` and `noneOf'` from `Text.Megaparsec.Char`. These were
seldom (if ever) used and are easily re-implemented.
* Added `notChar` in `Text.Megaparsec.Char`.
* Added `space1` in `Text.Megaparsec.Char`. This parser is like `space` but
requires at least one space character to be present to succeed.
* Added new module `Text.Megaparsec.Byte`, which is similar to
`Text.Megaparsec.Char`, but for token streams of the type `Word8` instead
of `Char`.
* `integer` was dropped from `Text.Megaparsec.Char.Lexer`. Use `decimal`
instead.
* `number` was dropped from `Text.Megaparsec.Char.Lexer`. Use `scientific`
instead.
* `decimal`, `octal`, and `hexadecimal` are now polymorphic in their return
type and can be used to parse any instance of `Integral`.
* `float` is now polymorphic in its return type and can be used to parse any
instance of `RealFloat`.
* Added new module `Text.Megaparsec.Byte.Lexer`, which provides some
functions (white space and numeric helpers) from
`Text.Megaparsec.Char.Lexer` for streams with token type `Word8`.
## Megaparsec 5.3.1
* Various updates to the docs.
* Allowed `QuickCheck-2.10`.
## Megaparsec 5.3.0
* Added the `match` combinator that allows to get collection of consumed
tokens along with result of parsing.
* Added the `region` combinator which allows to process parse errors
happening when its argument parser is run.
* Added the `getNextTokenPosition`, which returns position where the next
token in the stream begins.
* Defined `Semigroup` and `Monoid` instances of `ParsecT`.
* Dropped support for GHC 7.6.
* Added an `ErrorComponent` instance for `()`.
## Megaparsec 5.2.0
* Added `MonadParsec` instance for `RWST`.
* Allowed `many` to run parsers that do not consume input. Previously this
signalled an `error` which was ugly. Of course, in most cases giving
`many` a parser that do not consume input will lead to non-termination
bugs, but there are legal cases when this should be allowed. The test
suite now contains an example of this. Non-termination issues is something
inherited from the power Megaparsec gives (with more power comes more
responsibility), so that `error` case in `many` really does not solve the
problem, it was just a little ah-hoc guard we got from Parsec's past.
* The criterion benchmark was completely re-written and a new weigh
benchmark to analyze memory consumption was added.
* Performance improvements: `count` (marginal improvement, simpler
implementation), `count'` (considerable improvement), and `many`
(marginal improvement, simpler implementation).
* Added `stateTokensProcessed` field to parser state and helper functions
`getTokensProcessed` and `setTokensProcessed`. The field contains number
of processed tokens so far. This allows, for example, create wrappers that
return just parsed fragment of input stream alongside with result of
parsing. (It was possible before, but very inefficient because it required
traversing entire input stream twice.)
* `IndentNone` option of `indentBlock` now picks whitespace after it like
its sisters `IndentMany` and `IndentSome` do, see #161.
* Fixed a couple of quite subtle bugs in `indentBlock` introduced by
changing behaviour of `skipLineComment` in version 5.1.0. See #178 for
more information.
## Megaparsec 5.1.2
* Stopped using property tests with `dbg` helper to avoid flood of debugging
info when test suite is run.
* Fixed the build with `QuickCheck` versions older than 2.9.0.
## Megaparsec 5.1.1
* Exported the `observing` primitive from `Text.Megaparsec`.
## Megaparsec 5.1.0
* Defined `displayException` for `ParseError`, so exceptions are displayed
in human-friendly form now. This works with GHC 7.10 and later.
* Line comments parsed by `skipLineComment` now may end at the end of input
and do not necessarily require a newline to be parsed correctly. See #119.
* Exposed `parseErrorTextPretty` function in `Text.Megaparsec.Error` to
allow to render `ParseError`s without stack of source positions.
* Eliminated the `old-tests` test suite — Parsec legacy. The cases that are
not already *obviously* covered in the main test suite were included into
it.
* Added `Arbitrary` instances for the following data types: `Pos`,
`SourcePos`, `ErrorItem`, `Dec`, `ParseError` and `State`. This should
make testing easier without the need to add orphan instances every time.
The drawback is that we start to depend on `QuickCheck`, but that's a fair
price.
* The test suite now uses the combination of Hspec and the
`hpesc-megaparsec` package, which also improved the latter (that package
is the recommended way to test Megaparsec parsers).
* The `try` combinator now truly backtracks parser state when its argument
parser fails (either consuming input or not). Most users will never notice
the difference though. See #142.
* Added the `dbg` function that should be helpful for debugging.
* Added `observing` primitive combinator that allows to “observe” parse
errors without ending parsing (they are returned in `Left`, while normal
results are wrapped in `Right`).
* Further documentation improvements.
## Megaparsec 5.0.1
* Derived `NFData` instances for `Pos`, `InvalidPosException`, `SourcePos`,
`ErrorItem`, `Dec`, `ParseError`, and `State`.
* Derived `Data` instance for `ParseError`, `Data` and `Typeable` instances
for `SourcePos` and `State`.
* Minor documentation improvements.
## Megaparsec 5.0.0
### General changes
* Removed `parseFromFile` and `StorableStream` type-class that was necessary
for it. The reason for removal is that reading from file and then parsing
its contents is trivial for every instance of `Stream` and this function
provides no way to use newer methods for running a parser, such as
`runParser'`. So, simply put, it adds little value and was included in 4.x
versions for compatibility reasons.
* Moved position-advancing function from arguments of `token` and `tokens`
functions to `Stream` type class (named `updatePos`). The new function
allows to handle custom streams of tokens where every token contains
information about its position in stream better (for example when stream
of tokens is produced with happy/alex).
* Support for include files (stack of positions instead of flat position)
added. The new functions `pushPosition` and `popPosition` can be used to
move “vertically” in the stack of positions. `getPosition` and
`setPosition` still work on top (“current file”) level, but user can get
full stack via `getParserState` if necessary. Note that `ParseError` and
pretty-printing for it also support the new feature.
* Added type function `Token` associated with `Stream` type class. The
function returns type of token corresponding to specific token stream.
* Type `ParsecT` (and also type synonym `Parsec`) are now parametrized over
type of custom component in parse errors.
* Parameters of `MonadParsec` type class are: `e` — type of custom component
in parse errors, `s` — type of input stream, and `m` — type of underlying
monad.
* Type of `failure` primitive combinator was changed, now it accepts three
arguments: set of unexpected items, set of expected items, and set of
custom data.
* Type of `token` primitive combinator was changed, now in case of failure a
triple-tuple is returned with elements corresponding to arguments of
`failure` primitive. The `token` primitive can also be optionally given an
argument of token type to use in error messages (as expected item) in case
of end of input.
* `unexpected` combinator now accepts argument of type `ErrorItem` instead
of plain `String`.
* General performance improvements and improvements in speed of some
combinators, `manyTill` in particular.
### Error messages
* The module `Text.Megaparsec.Pos` was completely rewritten. The new module
uses `Pos` data type with smart constructors to ensure that things like
line and column number can be only positive. `SourcePos` on the other hand
does not require smart constructors anymore and its constructors are
exported. `Show` and `Read` instances of `SourcePos` are derived and
pretty-printing is done with help of `sourcePosPretty` function.
* The module `Text.Megaparsec.Error` was completely rewritten. A number of
new types and type-classes are introduced: `ErrorItem`, `Dec`,
`ErrorComponent`, and `ShowErrorComponent`. `ParseError` does not need
smart constructors anymore and its constructor and field selectors are
exported. It uses sets (from the `containers` package) instead of sorted
lists to enumerate unexpected and expected items. The new definition is
also parametrized over token type and custom data type which can be passed
around as part of parse error. Default “custom data” component is `Dec`,
which see. All in all, we have completely well-typed and extensible error
messages now. `Show` and `Read` instances of `ParseError` are derived and
pretty-printing is done with help of `parseErrorPretty`.
* The module `Text.Megaparsec.ShowToken` was eliminated and type class
`ShowToken` was moved to `Text.Megaparsec.Error`. The only method of that
class in now named `showTokens` and it works on streams of tokens, where
single tokes are represented by `NonEmpty` list with single element.
### Built-in combinators
* Combinators `oneOf`, `oneOf'`, `noneOf`, and `noneOf'` now accept any
instance of `Foldable`, not only `String`.
### Lexer
* Error messages about incorrect indentation levels were greatly improved.
Now every such message contains information about desired ordering between
“reference” indentation level and actual indentation level as well as
values of these levels. The information is stored in `ParseError` in
well-typed form and can be pretty-printed when necessary. As part of this
improvement, type of `indentGuard` was changed.
* `incorrectIndent` combinator is introduced in `Text.Megaparsec.Lexer`
module. It allows to fail with detailed information regarding incorrect
indentation.
* Introduced `scientific` parser that can parse arbitrary big numbers
without error or memory overflow. `float` still returns `Double`, but it's
defined in terms of `scientific` now. Since `Scientific` type can reliably
represent integer values as well as floating point values, `number` now
returns `Scientific` instead of `Either Integer Double` (`Integer` or
`Double` can be extracted from `Scientific` value anyway). This in turn
makes `signed` parser more natural and general, because we do not need
ad-hoc `Signed` type class anymore.
* Added `skipBlockCommentNested` function that should help parse possibly
nested block comments.
* Added `lineFold` function that helps parse line folds.
## Megaparsec 4.4.0
* Now state returned on failure is the exact state of parser at the moment
when it failed, which makes incremental parsing feature much better and
opens possibilities for features like “on-the-fly” recovering from parse
errors.
* The `count` combinator now works with `Applicative` instances (previously
it worked only with instances of `Alternative`). It's now also faster.
* `tokens` and parsers built upon it (such as `string` and `string'`)
backtrack automatically on failure now, that is, when they fail, they
never consume any input. This is done to make their consumption model
match how error messages are reported (which becomes an important thing as
user gets more control with primitives like `withRecovery`). This means,
in particular, that it's no longer necessary to use `try` with
`tokens`-based parsers. This new feature *does not* affect performance in
any way.
* New primitive parser `withRecovery` added. The parser 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.
* `eitherP` combinator added.
* Removed `Enum` instance of `Message` type. This was Parsec's legacy that
we should eliminate now. `Message` does not constitute enumeration,
`toEnum` was never properly defined for it. The idea to use `fromEnum` to
determine type of `Message` is also ugly, for this purpose new functions
`isUnexpected`, `isExpected`, and `isMessage` are defined in
`Text.Megaparsec.Error`.
* Minor tweak in signature of `MonadParsec` type class. Collection of
constraints changed from `Alternative m, Monad m, Stream s t` to
`Alternative m, MonadPlus m, Stream s t`. This is done to make it easier
to write more abstract code with older GHC where such primitives as
`guard` are defined for instances of `MonadPlus`, not `Alternative`.
## Megaparsec 4.3.0
* Canonicalized `Applicative`/`Monad` instances. Thanks to Herbert Valerio
Riedel.
* Custom messages in `ParseError` are printed each on its own line.
* Now accumulated hints are not used with `ParseError` records that have
only custom messages in them (created with `Message` constructor, as
opposed to `Unexpected` or `Expected`). This strips “expected” line from
custom error messages where it's unlikely to be relevant anyway.
* Added higher-level combinators for indentation-sensitive grammars:
`indentLevel`, `nonIndented`, and `indentBlock`.
## Megaparsec 4.2.0
* Made `newPos` constructor and other functions in `Text.Megaparsec.Pos`
smarter. Now it's impossible to create `SourcePos` with non-positive line
number or column number. Unfortunately we cannot use `Numeric.Natural`
because we need to support older versions of `base`.
* `ParseError` is now a monoid. `mergeError` is used as `mappend`.
* Added functions `addErrorMessages` and `newErrorMessages` to add several
messages to existing error and to construct error with several attached
messages respectively.
* `parseFromFile` now lives in `Text.Megaparsec.Prim`. Previously we had 5
nearly identical definitions of the function, varying only in
type-specific `readFile` function. Now the problem is solved by
introduction of `StorableStream` type class. All supported stream types
are instances of the class out of box and thus we have polymorphic version
of `parseFromFile`.
* `ParseError` is now instance of `Exception` (and `Typeable`).
* Introduced `runParser'` and `runParserT'` functions that take and return
parser state. This makes it possible to partially parse input, resume
parsing, specify non-standard initial textual position, etc.
* Introduced `failure` function that allows to fail with arbitrary
collection of messages. `unexpected` is now defined in terms of
`failure`. One consequence of this design decision is that `failure` is
now method of `MonadParsec`, while `unexpected` is not.
* Removed deprecated combinators from `Text.Megaparsec.Combinator`:
* `chainl`
* `chainl1`
* `chainr`
* `chainr1`
* `number` parser in `Text.Megaparsec.Lexer` now can be used with `signed`
combinator to parse either signed `Integer` or signed `Double`.
## Megaparsec 4.1.1
* Fixed bug in implementation of `sepEndBy` and `sepEndBy1` and removed
deprecation notes for these functions.
* Added tests for `sepEndBy` and `sepEndBy1`.
## Megaparsec 4.1.0
* Relaxed dependency on `base`, so that minimal required version of `base`
is now 4.6.0.0. This allows Megaparsec to compile with GHC 7.6.x.
* `Text.Megaparsec` and `Text.Megaparsec.Prim` do not export data types
`Consumed` and `Reply` anymore because they are rather low-level
implementation details that should not be visible to end-user.
* Representation of file name and textual position in error messages was
made conventional.
* Fixed some typos is documentation and other materials.
## Megaparsec 4.0.0
### General changes
* Renamed `many1` → `some` as well as other parsers that had `many1` part in
their names.
* The following functions are now re-exported from `Control.Applicative`:
`(<|>)`, `many`, `some`, `optional`. See #9.
* Introduced type class `MonadParsec` in 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 of `MonadParsec`, not only with
`ParsecT`.
* Added new function `parseMaybe` for 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 `notFollowedBy` always 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 old `token`, because `tokenPrim` is
more general and original `token` is little used.
* Made `token` parser more powerful, now its second argument can return
`Either [Message] a` instead of `Maybe a`, so it can influence error
message when parsing of token fails. See #29.
* Added new primitive combinator `hidden p` which hides “expected” tokens in
error message when parser `p` fails.
* Tab width is not hard-coded anymore. It can be manipulated via
`getTabWidth` and `setTabWidth`. Default tab-width is `defaultTabWidth`,
which is 8.
### Error messages
* Introduced type class `ShowToken` and improved representation of
characters and strings in error messages, see #12.
* Greatly improved quality of error messages. Fixed entire
`Text.Megaparsec.Error` module, 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 module `Utils.hs` in `old-tests` for example.
* Reduced number of `Message` constructors (now there are only `Unexpected`,
`Expected`, and `Message`). 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.Prim` a lot clearer.
### Built-in combinators
* All built-in combinators in `Text.Megaparsec.Combinator` now work with any
instance of `Alternative` (some of them even with `Applicative`).
* Added more powerful `count'` parser. This parser can be told to parse from
`m` to `n` occurrences of some thing. `count` is defined in terms of
`count'`.
* Removed `optionMaybe` parser, because `optional` from
`Control.Applicative` does the same thing.
* Added combinator `someTill`.
* These combinators are considered deprecated and will be removed in future:
* `chainl`
* `chainl1`
* `chainr`
* `chainr1`
* `sepEndBy`
* `sepEndBy1`
### Character parsing
* Renamed some parsers:
* `alphaNum` → `alphaNumChar`
* `digit` → `digitChar`
* `endOfLine` → `eol`
* `hexDigit` → `hexDigitChar`
* `letter` → `letterChar`
* `lower` → `lowerChar`
* `octDigit` → `octDigitChar`
* `space` → `spaceChar`
* `spaces` → `space`
* `upper` → `upperChar`
* Added new character parsers in `Text.Megaparsec.Char`:
* `asciiChar`
* `charCategory`
* `controlChar`
* `latin1Char`
* `markChar`
* `numberChar`
* `printChar`
* `punctuationChar`
* `separatorChar`
* `symbolChar`
* Descriptions of old parsers have been updated to accent some
Unicode-specific moments. For example, old description of `letter` stated
that it parses letters from “a” to “z” and from “A” to “Z”. This is wrong,
since it used `Data.Char.isAlpha` predicate internally and thus parsed
many more characters (letters of non-Latin languages, for example).
* Added combinators `char'`, `oneOf'`, `noneOf'`, and `string'` which are
case-insensitive variants of `char`, `oneOf`, `noneOf`, and `string`
respectively.
### 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, `integer` and
`float` now parse numbers without sign.
* Removed `natural` parser, it's equal to new `integer` now.
* Renamed `naturalOrFloat` → `number` — this doesn't parse sign too.
* Added new combinator `signed` to parse all sorts of signed numbers.
* Transformed `Text.Parsec.Token` into `Text.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` → `makePermParser`
* `buildExpressionParser` → `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 `Eq` instance for `ParseError`.
* Fixed a regression from 3.1.6: `runP` is again exported from module
`Text.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 `Text` instances from `Text.Parsec`.
* Make `Text.Parsec` exports more visible.
* Re-arrange `Text.Parsec` exports.
* Add functions `crlf` and `endOfLine` to `Text.Parsec.Char` for 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.
|