Skip to content

Releases: foonathan/lexy

Release 2025.05.0

29 May 18:05

Choose a tag to compare

Potential breaking changes

  • scanner-common::capture_token was renamed to scanner-common::capture, and old scanner-common::capture removed.
    Previously, capture_token was a linker error anyway, but if you're calling scanner-common::capture it will no longer work for arbitrary rules and instead only like dsl::capture.
  • lexy::parse_as_tree will add a position token to production nodes that would otherwise be empty.
    That way, no production node will be empty, unless the builder API is used directly.
  • Change lexy::dsl::try_() error recovery behavior:
    It will now skip whitespace after the (optional) error recovery rule.
  • Deprecate the lexy::parse_tree::builder::finish() overload that does not take a remaining_input.
  • The typo lexy::code_point::spaing_mark was fixed to spacing_mark.

New Features

  • Experimental: Add lexy::parse_tree_input and lexy::dsl::tnode/lexy::dsl::pnode to support multi-pass parsing.
  • Add lexy::dsl::byte.if_/set/range/ascii methods to match specific bytes.
  • Add an overload of fatal_error() on scanners that allows construction of type-erased generic errors (#134).
  • Add lexy::buffer::release() and lexy::buffer::adopt() to deconstruct a buffer into its components and re-assemble it later.
  • Add lexy::parse_tree::node::position() and ::covering_lexeme().
  • Add default argument to lexy::dsl::flag().
  • Add lexy::callback_with_state.
  • Pass the parse state to the tag of lexy::dsl::op if required (#172) and to lexy::dsl::error (#211).
  • Enable CMake install rule for subdirectory builds (#205).

Bug fixes

  • Add missing constexpr to container callbacks and lexy::as_string.
  • Fix infinite loop in dsl::delimited when dealing with invalid code points (#173).
  • Fix swallowed errors from case-folding rules (#149).
  • Fix lexy::production_name for productions in an anonymous namespace.
  • Fix bugs in dsl::scan (#133, #135, #142, #154, #209).
  • Fix bug with the position passed to the tag constructor of lexy::dsl::op (#170).
  • Fix bug where lexy_ext::report_error unconditionally wrote to stderr, ignoring the output iterator.
  • Fix bug with missing lexy::error_context::position in lexy::parse_as_tree (#184).
  • Fix static_assert in lexy::parse_tree (#190).
  • Fix bugs in lexy::input_location::operator< (#228).
  • Fix bugs in examples (#183)
  • Add missing && in lexy::bind_sink (#221).
  • Workaround compiler bugs and improve documentation (#128, #129, #146, #181, #197, #216, #227).

New Contributors

Full Changelog: v2022.12.1...v2025.05.0

Release 2022.12.1

04 Jan 11:19

Choose a tag to compare

  • Add constructor to lexy::input_location.
  • lexy::error_context::production will not be a transparent production.
  • Fix lexy::production_info::operator== when the compiler doesn't merge string literals.
  • Fix SWAR matching of dsl::ascii::print and dsl::ascii::graph.
  • Fix CMake target installation (#108).

New Contributors

Full Changelog: v2022.12.0...v2022.12.1

Release 2022.12.0

07 Dec 10:09

Choose a tag to compare

Headline: Unicode 15 support, ability to split a grammar into multiple translation units using lexy::dsl::subgrammar, and significant performance improvements.

Potential breaking changes

  • Change [lexy::dsl::peek_not() error recovery behavior:
    it will now consume the input it matched to recover, which is more useful.
  • Remove Production parameter from lexy::error_context.
    It is replaced by a type-erased lexy::production_info.
  • lexy::validate, lexy::parse, and lexy::parse_as_tree now type-erase generic error tags prior to invoking the callback.
  • Use type-erased lexy::production_info instead of Production type in lexy::parse_tree.
    This is technically a breaking change, as it may affect overload resolution.

New features

  • Update Unicode database to Unicode 15.
  • Use SWAR (SIMD within a register) techniques to optimize token parsing.
  • Add lexy::dsl::subgrammar to split a grammar into multiple translation units.
  • Add lexy::dsl::flags and lexy::dsl::flag to parse enum flags.
  • Add overload of lexy::dsl::position that parses a rule.
    This allows using it as branch conditions.
  • Add lexy::dsl::effect to trigger side-effects during parsing.
  • Add lexy::subexpression_production to parse a subexpression.
  • Add lexy::utf8_char_encoding.
  • Add lexy::parse_tree::remaining_input() and populate it by lexy::parse_as_tree.
  • Add lexy::make_buffer_from_input function.
  • Add type-erased version of lexy::error.
  • Support non-const parse state.

Bugfixes

  • Fix bug where lexy::bind callback does not forward rvalue arguments; they got turned into lvalues instead.
  • Fix bug where callback composition was not allowed if the final callback returns void.
  • Fix bug where dsl::quoted(cc.error<foo>) did not use foo as the error.

New Contributors

Full Changelog: v2022.05.1...v2022.12.0

Release 2022.05.1

13 Jul 11:07

Choose a tag to compare

  • Change dsl::scan: it will now be invoked with the previously produced values.
  • Add dsl::parse_as to ensure that a rule always produces a value (e.g. when combined with the dsl::scan change above).
  • Add lexy::lexeme_input to support multi-pass parsing.
  • Turn dsl::terminator(term)(branch) into a branch rule, as opposed to being a plain rule (#74).
  • Add dsl::ignore_trailing_sep() separator.
  • Add lexy::bounded<T, Max> for bounded integer parsing (#72).
  • Add dsl::code_unit_id rule.
  • Turn lexy::forward<void> into a sink.
  • Support references in lexy::parse_result and lexy::scan_result
  • Fix bug that prevented lexy::parse with a root production whose value is void.
  • Fix bug that caused infinite template instantiations for recursive scans.
  • Fix bug that didn't skip whitespace in lexy::scanner for token productions.

Release 2022.05.0-beta

03 May 14:44

Choose a tag to compare

Pre-release

Initial release.