# parser-lang v1.0.0 — API freeze
**Stable.** v1.0.0 freezes the public API. The cursor and Pratt engine built in
0.2.0 are now under a Semantic Versioning promise: no breaking change before `2.0`,
additions only in minor releases, MSRV (Rust 1.85) rising only in a minor. There
are no functional API changes from `0.2.0`; this release is the commitment.
## What is parser-lang?
The parsing toolkit of the `-lang` family: a token cursor a recursive-descent
grammar threads, a Pratt precedence engine for expressions, and error recovery that
emits source-annotated diagnostics. It owns no grammar and no AST — the grammar's
own functions build whatever output they like — so one toolkit serves every
language. It consumes [`token-lang`] tokens and reports [`diag-lang`] diagnostics.
## The frozen surface
- **`Parser<'t, K>`** — the cursor: `peek` / `bump` / `eat` / `expect`, error
reporting and `recover`, `repeated` / `separated`, `checkpoint` / `rewind`, and
the collected-diagnostics accessors. Trivia is skipped automatically; kinds are
matched by predicate.
- **`Checkpoint`** — an opaque snapshot for speculative parsing.
- **`Pratt`** — a precedence-climbing trait (`prefix` / `infix_binding` / `infix`)
with a provided `expression` / `parse` driver.
- **Re-exports** — `Token`, `TokenKind`, `Span` (token-lang) and `Diagnostic`
(diag-lang).
The full reference, the SemVer promise, and what is deliberately left out (an
`ast-lang` dependency, a combinator layer, a depth guard — all addable later) are
in [`docs/API.md`](https://github.com/jamesgober/parser-lang/blob/main/docs/API.md).
## Guarantees
- **Total cursor.** Navigation never panics and never reads past the end, on any
token slice — empty, unterminated, or hostile. Held by a property test over
arbitrary streams.
- **Correct precedence.** The Pratt engine groups operators exactly as an
independent shunting-yard oracle does, for every random operator sequence —
precedence and associativity both.
- **Recovery makes progress.** `recover`, `repeated`, and `separated` cannot loop
without consuming input; errors are collected so one run reports many.
- **Speculation rolls back cleanly.** A `rewind` restores the cursor and drops any
diagnostics recorded since the checkpoint.
- **`no_std`** with `alloc`; `#![forbid(unsafe_code)]`; no `unwrap`/`expect`/`todo!`
in shipping code.
## Breaking changes
**None.** Identical API to `0.2.0`. From here, breaking changes require `2.0`.
## Verification
```bash
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo clippy --all-targets --all-features -- -D warnings
cargo clippy --no-default-features -- -D warnings
cargo test
cargo test --all-features
cargo build --no-default-features
cargo +1.85 build --all-features
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features
cargo audit
cargo deny check
```
All green. Counts: 12 unit + 9 calculator + 2 property + 13 doctests.
## Installation
```toml
[dependencies]
parser-lang = "1"
```
MSRV: Rust 1.85.
---
**Full diff:** [`v0.2.0...v1.0.0`](https://github.com/jamesgober/parser-lang/compare/v0.2.0...v1.0.0).
**Changelog:** [`CHANGELOG.md`](https://github.com/jamesgober/parser-lang/blob/main/CHANGELOG.md#100---2026-06-28).