nom-derive
Overview
nom-derive is a custom derive attribute, to derive nom parsers automatically from the structure definition.
It is not meant to replace nom, but to provide a quick and easy way to generate parsers for structures, especially for simple structures. This crate aims at simplifying common cases. In some cases, writing the parser manually will remain more efficient.
- API documentation
- Documentation of
Nomattribute. This is the main documentation for this crate, with all possible options and many examples.
Feedback welcome !
#[derive(Nom)]
This crate exposes a single custom-derive macro Nom which
implements parse for the struct it is applied to.
The goal of this project is that:
derive(Nom)should be enough for you to derive nom parsers for simple structures easily, without having to write it manually- it allows overriding any parsing method by your own
- it allows using generated parsing functions along with handwritten parsers and combining them without efforts
nom-derive adds declarative parsing to nom. It also allows mixing with
procedural parsing easily, making writing parsers for byte-encoded formats
very easy.
For example:
use Nom;
This adds a static method parse to S, with the following signature:
To parse input, just call let res = S::parse(input);.
For extensive documentation of all attributes and examples, see the Nom derive attribute documentation.
Many examples are provided, and more can be found in the project tests.
Debug tips
- If the generated parser does not compile, add
#[nom(DebugDerive)]to the structure. It will dump the generated parser tostderr. - If the generated parser fails at runtime, try adding
#[nom(Debug)]to the structure or to fields. It wraps subparsers indbg_dmpand will print the field name and input tostderrif the parser fails.
Changes
0.6.0
- Switch to nom parsing functions, do not generate macros
- Use qualified paths, caller do not have to import nom macros
- Move all attributes under the 'nom' namespace
- Add many attributes (LittleEndian, BigEndian, Map, Debug, Value, etc.)
- Deprecate the
NomDeriveDebugderive (replaced byDebugDeriveattribute) - Improve documentation, add many examples
0.5.0
- Upgrade to nom 5.0
- The
parsemethod is now public - Upgrade dependencies (syn, quote, proc-macro2)
0.4.0
- Add support for
Enumparser generator- Enums require a selector to choose the variant
- Fieldless enums (list of constants) are handled as a special case
- Add
NomDeriveDebugattribute to display generated parser on stderr during build
0.3.0
- Move crate to rust-bakery github project
- Add
Countattribute
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.