Changelog

This project adheres to Semantic Versioning. Lines marked with 🧨 describe breaking changes.

[Unreleased]

[4.0] -- 2024-10-08

Changed

The parser is made functional: the use of camlp-streams has been dropped in favour of sequences of the Seq module. The parser is written in a monad.

🧨 The error `Op_conflict now takes a single argument instead of two.

🧨 Introduced a type for parsers. The function expression builds a parser that can then be run on any sequence with the run function.

🧨 A token can have different fixities depending on the context its in. For instance, the - can be declared both prefix and infix, resulting in - x - y being parsed as (-x) - y. Consequently the API changed. The parser now truly parses the input, meaning that the output datatype may be different from the input datatype: the main expression function changed from

Consequently, the ~appl argument of the expression function now operates on the output type, and a new argument ~token must be given which parses tokens that aren't operators.

The expression function also takes an Operators.t value instead of a function is_op: 'a -> (fixity * float) option to parse operators. To use the new datatype, the rule is the following. For any operator op

🧨 Use camel case for errors: OpConflict changed to Op_conflict and TooFewArguments to Too_few_arguments.

Removed

🧨 Errors UnexpectedPostfix and UnexpectedInfix have been removed. If a infix operator appears postfix, it's handled by the token parser rather than the operator parser.

[3.0.1] -- 2023-11-06

Added

Lower bounds on test dependencies alcotest, qcheck and qcheck-alcotest.

[3.0] -- 2023-11-04

Changed

🧨 Removed the functor interface, the parser is a single function taking two functions and a stream of terms as parameters.

No more table type needed, the parser only needs a function is_op to distinguish operators from other tokens.

To port code, any snippet like

module S : SUPPORT = struct
  type term = ...
  type table = ...
  let get tbl t = ...
  let make_appl t u = ...
end
module P = Pratter.Make(S)

should be replaced by

let is_op t = ...
let appl t u = ...

where the following properties hold

Under these assumptions, denoting tbl the value that makes the second hypothesis hold, we have P.expression tbl = Pratter.expression ~is_op ~appl

[2.0] -- 2022-06-15

Added

Changed

[1.2.1] -- 2022-05-06

Added

Changed

[1.2] -- 2021-05-05

Added

Fixed

[1.1] -- 2021-01-23

Added

Changed

[1.0.1] -- 2021-01-16

Fixed

Added

[1.0] -- 2021-01-14

Changed

[0.1.1] -- 2021-01-06

Added