Skip to content

[new release] parseff (0.1.0)#29526

Merged
mseri merged 1 commit intoocaml:masterfrom
davesnx:release-parseff-0.1.0
Mar 18, 2026
Merged

[new release] parseff (0.1.0)#29526
mseri merged 1 commit intoocaml:masterfrom
davesnx:release-parseff-0.1.0

Conversation

@davesnx
Copy link
Contributor

@davesnx davesnx commented Mar 9, 2026

Direct-style parser combinator library for OCaml 5 powered by algebraic effects

CHANGES:

Initial release of Parseff -- a direct-style parser combinator library for
OCaml 5 powered by algebraic effects.

  • Direct-style parsers as plain unit -> 'a functions, no monadic or binding operators needed
  • Algebraic effects for control flow, backtracking, and streaming input
  • Typed errors via polymorphic variants with position tracking
  • Built-in error variants: `Expected, `Unexpected_end_of_input, `Depth_limit_exceeded
  • Automatic backtracking with or_, one_of, and one_of_labeled
  • Primitive parsers: consume, satisfy, char, match_regex, take_while, skip_while, fail, error
  • Repetition combinators: many, sep_by, between, end_by, count, optional
  • Operator chains: chainl, chainl1, chainr, chainr1 for expression parsing
  • Look-ahead parsing and depth-limited recursion via rec_ (default depth: 128)
  • Convenience parsers: digit, letter, alphanum, whitespace, any_char
  • Zero-copy span APIs: take_while_span, sep_by_take_span returning { buf; off; len } records
  • Fused operations for hot paths: sep_by_take, fused_sep_take, skip_while_then_char
  • Streaming support via Source.of_string, Source.of_channel, Source.of_function
  • Backtrack-across-chunk-boundary support for streaming sources
  • Non-fatal diagnostics with warn / warn_at, rolled back on backtracking
  • parse_until_end / parse_source_until_end runners that collect diagnostics
  • Error labeling with expect and one_of_labeled for clear error messages
  • Domain-safe: no global mutable state, independent parses run in parallel across OCaml 5 domains
  • 2-4x faster than Angstrom and MParser on equivalent parsers
  • Single runtime dependency: re for regex support

Copy link
Member

@jmid jmid left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

This is failing with

#=== ERROR while compiling parseff.0.1.0 ======================================#
# context              2.5.0 | linux/x86_64 | ocaml-base-compiler.5.4.0 | pinned(https://github.com/davesnx/parseff/releases/download/0.1.0/parseff-0.1.0.tbz)
# path                 ~/.opam/5.4/.opam-switch/build/parseff.0.1.0
# command              ~/.opam/opam-init/hooks/sandbox.sh build dune build -p parseff -j 71 @install
# exit-code            1
# env-file             ~/.opam/log/parseff-7-3f4c23.env
# output-file          ~/.opam/log/parseff-7-3f4c23.out
### output ###
# File "dune", lines 9-17, characters 0-350:
#  9 | (rule
# 10 |  (alias doc-markdown)
# 11 |  (mode
# 12 |   (promote (until-clean)))
# 13 |  (deps %{workspace_root}/_doc/_markdown/parseff/README.md)
# 14 |  (targets README.md)
# 15 |  (action
# 16 |   (system
# 17 |    "printf '<!-- Please do not edit this file directly. Update README.mld instead. -->\\n\\n' > %{targets} && tail -n +2 %{workspace_root}/_doc/_markdown/parseff/README.md >> %{targets}")))
# Error: No rule found for _doc/_markdown/parseff/README.md

@davesnx
Copy link
Contributor Author

davesnx commented Mar 11, 2026

Released a new package with a lowerbound for odoc

@davesnx davesnx force-pushed the release-parseff-0.1.0 branch from 70c6940 to fc5705c Compare March 11, 2026 09:29
@mseri
Copy link
Member

mseri commented Mar 12, 2026

@mtelvers do you know why the opam-ci is not showing up?

@davesnx davesnx force-pushed the release-parseff-0.1.0 branch from fc5705c to 00fc603 Compare March 15, 2026 08:58
CHANGES:

Initial release of Parseff -- a direct-style parser combinator library for
OCaml 5 powered by algebraic effects.

- Direct-style parsers as plain `unit -> 'a` functions, no monadic or binding operators needed
- Algebraic effects for control flow, backtracking, and streaming input
- Typed errors via polymorphic variants with position tracking
- Built-in error variants: `` `Expected ``, `` `Unexpected_end_of_input ``, `` `Depth_limit_exceeded ``
- Automatic backtracking with `or_`, `one_of`, and `one_of_labeled`
- Primitive parsers: `consume`, `satisfy`, `char`, `match_regex`, `take_while`, `skip_while`, `fail`, `error`
- Repetition combinators: `many`, `sep_by`, `between`, `end_by`, `count`, `optional`
- Operator chains: `chainl`, `chainl1`, `chainr`, `chainr1` for expression parsing
- Look-ahead parsing and depth-limited recursion via `rec_` (default depth: 128)
- Convenience parsers: `digit`, `letter`, `alphanum`, `whitespace`, `any_char`
- Zero-copy span APIs: `take_while_span`, `sep_by_take_span` returning `{ buf; off; len }` records
- Fused operations for hot paths: `sep_by_take`, `fused_sep_take`, `skip_while_then_char`
- Streaming support via `Source.of_string`, `Source.of_channel`, `Source.of_function`
- Backtrack-across-chunk-boundary support for streaming sources
- Non-fatal diagnostics with `warn` / `warn_at`, rolled back on backtracking
- `parse_until_end` / `parse_source_until_end` runners that collect diagnostics
- Error labeling with `expect` and `one_of_labeled` for clear error messages
- Domain-safe: no global mutable state, independent parses run in parallel across OCaml 5 domains
- 2-4x faster than Angstrom and MParser on equivalent parsers
- Single runtime dependency: `re` for regex support
@mseri
Copy link
Member

mseri commented Mar 18, 2026

Two machines in the CI keep being stuck, not your problem. Thanks!

@mseri mseri merged commit 88dca8e into ocaml:master Mar 18, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants