4 releases (breaking)

0.4.0 May 27, 2023
0.3.0 May 22, 2023
0.2.0 May 17, 2023
0.1.0 May 15, 2023

#1919 in Parser implementations

MIT/Apache

83KB
2K SLoC

Any-sexpr

This is an S-Expression parser and formatter with the following goals:

  • Offering direct access to the tokenizer, anysexpr::parse, but also anysexpr::read to build an in-memory tree easily.

  • Good error reporting (precise location information and messages).

  • (Future) Make the data constructors for anysexpr::read parametrizable (generic), e.g. like in the sexpr_parser crate.

  • Streaming: allow to read from and print to file handles lazily, for use e.g. in communications. This currently works by using anysexpr::parse directly for input, or creating tokens to print via a custom loop for output. Future: more possibilities, e.g. turn a tree into a token stream, or parameterize with a tree that's generated on demand while printing.

  • (Future) Support various s-expression variants (R*RS, Guile, Clojure, Common Lisp, ..) via runtime (and compile-time?) settings.

  • (Perhaps) be usable on microcontrollers (small code, no-std?).

The author is quite new to Rust. There will be API guideline entries not currently being followed, help in that area is as welcome as in other areas.

Usage

See examples/main.rs.

Todo

  • string escape features on printing
  • inexact and complex numbers
  • performance tuning?, perhaps do not use genawaiter?
  • better error behaviour: parser should return errors but try to make it possible to continue?
  • more tests (large test corpora, fuzzing round trips)
  • handle Guile, Clojure and other syntax versions
  • parametrization (generics) for tree generation / mapping (also/vs. Serde?)
  • lazy features as mentioned above
  • some level of support for pretty-printing

Orthogonally:

  • examine the lexpr crate in more detail (missed when researching existing crates before starting this project)

Contact

Christian Jaeger ch@christianjaeger.ch

Dependencies

~1.1–1.8MB
~39K SLoC