All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Properly fixed
skip_then_retry_until
regression
- Regression in
skip_then_retry_until
recovery strategy
- A
spill-stack
feature that usesstacker
to avoid stack overflow errors for deeply recursive parsers - The ability to access the token span when using
select!
likeselect! { |span| Token::Num(x) => (x, span) }
- Added a
skip_parser
recovery strategy that allows you to implement your own recovery strategies in terms of other parsers. For example,.recover_with(skip_parser(take_until(just(';'))))
skips tokens until after the next semicolon - A
not
combinator that consumes a single token if it is not the start of a given pattern. For example,just("\\n").or(just('"')).not()
matches anychar
that is not either the final quote of a string, and is not the start of a newline escape sequence - A
semantic_indentation
parser for parsing indentation-sensitive languages. Note that this is likely to be deprecated/removed in the future in favour of a more powerful solution #[must_use]
attribute for parsers to ensure that they're not accidentally created without being usedOption<Vec<T>>
andVec<Option<T>>
now implementChain<T>
andOption<String>
implementsChain<char>
choice
now supports both arrays and vectors of parsers in addition to tuples- The
Simple
error type now implementsEq
text::whitespace
returns aRepeated
instead of animpl Parser
, allowing you to call methods likeat_least
andexactly
on it.- Improved
no_std
support - Improved examples and documentation
- Use zero-width spans for EoI by default
- Don't allow defining a recursive parser more than once
- Various minor bug fixes
- Improved
Display
implementations for various built-in error types andSimpleReason
- Use an
OrderedContainer
trait to avoid unexpected behaviour for unordered containers in combination withjust
- Made several parsers (
todo
,unwrapped
, etc.) more useful by reporting the parser's location on panic - Boxing a parser that is already boxed just gives you the original parser to avoid double indirection
- Improved compilation speeds
then_with
combinator to allow limited support for parsing nested patterns- impl From<&[T; N]> for Stream
SkipUntil/SkipThenRetryUntil::skip_start/consume_end
for more precise control over skip-based recovery
- Allowed
Validate
to map the output type - Switched to zero-size End Of Input spans for default implementations of
Stream
- Made
delimited_by
take combinators instead of specific tokens - Minor optimisations
- Documentation improvements
- Compilation error with
--no-default-features
- Made default behaviour of
skip_until
more sensible
-
A new tutorial to help new users
-
select
macro, a wrapper overfilter_map
that makes extracting data from specific tokens easy -
choice
parser, a better alternative to longor
chains (which sometimes have poor compilation performance) -
todo
parser, that panics when used (but not when created) (akin to Rust'stodo!
macro, but for parsers) -
keyword
parser, that parses exact identifiers -
from_str
combinator to allow converting a pattern to a value inline, usingstd::str::FromStr
-
unwrapped
combinator, to automatically unwrap an output value inline -
rewind
combinator, that allows reverting the input stream on success. It's most useful when requiring that a pattern is followed by some terminating pattern without the first parser greedily consuming it -
map_err_with_span
combinator, to allow fetching the span of the input that was parsed by a parser before an error was encountered -
or_else
combinator, to allow processing and potentially recovering from a parser error -
SeparatedBy::at_most
to require that a separated pattern appear at most a specific number of times -
SeparatedBy::exactly
to require that a separated pattern be repeated exactly a specific number of times -
Repeated::exactly
to require that a pattern be repeated exactly a specific number of times -
More trait implementations for various things, making the crate more useful
- Made
just
,one_of
, andnone_of
significant more useful. They can now accept strings, arrays, slices, vectors, sets, or just single tokens as before - Added the return type of each parser to its documentation
- More explicit documentation of parser behaviour
- More doc examples
- Deprecated
seq
(just
has been generalised and can now be used to parse specific input sequences) - Sealed the
Character
trait so that future changes are not breaking - Sealed the
Chain
trait and made it more powerful - Moved trait constraints on
Parser
to where clauses for improved readability
- Fixed a subtle bug that allowed
separated_by
to parse an extra trailing separator when it shouldn't - Filled a 'hole' in the
Error
trait's API that conflated a lack of expected tokens with expectation of end of input - Made recursive parsers use weak reference-counting to avoid memory leaks
skip_until
error recovery strategySeparatedBy::at_least
andSeparatedBy::at_most
for parsing a specific number of separated itemsParser::validate
for integrated AST validationRecursive::declare
andRecursive::define
for more precise control over recursive declarations
- Improved
separated_by
error messages - Improved documentation
- Hid a new (probably) unused implementation details
take_until
primitive
- Added span to fallback output function in
nested_delimiters
- Support for LL(k) parsing
- Custom error recovery strategies
- Debug mode
- Nested input flattening
- Radically improved error quality