Quoth
Then this ebony bird beguiling my sad fancy into smiling,
By the grave and stern decorum of the countenance it wore,
“Though thy crest be shorn and shaven, thou,” I said, “art sure no craven,
Ghastly grim and ancient Raven wandering from the Nightly shore—
Tell me what thy lordly name is on the Night’s Plutonian shore!”
Quoth the Raven “Nevermore.”
— Edgar Allan Poe's The Raven
Quoth is a scannerless parsing library (meaning there is no lexing/tokenization step)
specifically designed for implementing languages and DSLs (domain specific languages) in Rust.
It is based on the admittedly dtolnayian idea from
syn that everything should implement the same Parse trait,
however quoth takes this idea further to the point where lexing is no longer necessary, and
what you are left with is something akin to "Object Oriented Parsing" where it is quite easy to
compose, combine, parse, and even "unparse" Parsables in a myriad of ways.
In quoth, everything implements Parsable, which brings with it a large set of requirements
(and thus features) that are at best conventions in other parsing ecosystems. Some core
features of quoth include:
- anything that can be parsed with quoth can also be "unparsed" i.e. converted back to a string
- because there is no tokenization step, the unmodified
Spansource text for anyParsableis always available and is cheap/free to access at any time during parsing Spanitself is very lightweight and is just a reference-counted string slice into aSource- because of this,
ParseStreamis also incredibly lightweight and provides normally expensive operations like forking virtually for free - in quoth, you can peek by
Parsabletype, but you can also peek by value, and even by regex - branching and ambiguity are much easier to deal with in quoth because forking is cheap and encouraged. This is a double-edged sword because it means you can efficiently parse ambiguous things that are normally inefficient to parse and hard to reason about, but now it is much easier to introduce ambiguity into your underlying grammar.
More information and docs will be coming in the next release