16855e09eSopenharmony_ci# nom, eating data byte by byte
26855e09eSopenharmony_ci
36855e09eSopenharmony_ci[![LICENSE](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
46855e09eSopenharmony_ci[![Join the chat at https://gitter.im/Geal/nom](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Geal/nom?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
56855e09eSopenharmony_ci[![Build Status](https://github.com/Geal/nom/actions/workflows/ci.yml/badge.svg)](https://github.com/Geal/nom/actions/workflows/ci.yml)
66855e09eSopenharmony_ci[![Coverage Status](https://coveralls.io/repos/github/Geal/nom/badge.svg?branch=main)](https://coveralls.io/github/Geal/nom?branch=main)
76855e09eSopenharmony_ci[![Crates.io Version](https://img.shields.io/crates/v/nom.svg)](https://crates.io/crates/nom)
86855e09eSopenharmony_ci[![Minimum rustc version](https://img.shields.io/badge/rustc-1.48.0+-lightgray.svg)](#rust-version-requirements-msrv)
96855e09eSopenharmony_ci
106855e09eSopenharmony_cinom is a parser combinators library written in Rust. Its goal is to provide tools
116855e09eSopenharmony_cito build safe parsers without compromising the speed or memory consumption. To
126855e09eSopenharmony_cithat end, it uses extensively Rust's *strong typing* and *memory safety* to produce
136855e09eSopenharmony_cifast and correct parsers, and provides functions, macros and traits to abstract most of the
146855e09eSopenharmony_cierror prone plumbing.
156855e09eSopenharmony_ci
166855e09eSopenharmony_ci![nom logo in CC0 license, by Ange Albertini](https://raw.githubusercontent.com/Geal/nom/main/assets/nom.png)
176855e09eSopenharmony_ci
186855e09eSopenharmony_ci*nom will happily take a byte out of your files :)*
196855e09eSopenharmony_ci
206855e09eSopenharmony_ci<!-- toc -->
216855e09eSopenharmony_ci
226855e09eSopenharmony_ci- [Example](#example)
236855e09eSopenharmony_ci- [Documentation](#documentation)
246855e09eSopenharmony_ci- [Why use nom?](#why-use-nom)
256855e09eSopenharmony_ci    - [Binary format parsers](#binary-format-parsers)
266855e09eSopenharmony_ci    - [Text format parsers](#text-format-parsers)
276855e09eSopenharmony_ci    - [Programming language parsers](#programming-language-parsers)
286855e09eSopenharmony_ci    - [Streaming formats](#streaming-formats)
296855e09eSopenharmony_ci- [Parser combinators](#parser-combinators)
306855e09eSopenharmony_ci- [Technical features](#technical-features)
316855e09eSopenharmony_ci- [Rust version requirements](#rust-version-requirements-msrv)
326855e09eSopenharmony_ci- [Installation](#installation)
336855e09eSopenharmony_ci- [Related projects](#related-projects)
346855e09eSopenharmony_ci- [Parsers written with nom](#parsers-written-with-nom)
356855e09eSopenharmony_ci- [Contributors](#contributors)
366855e09eSopenharmony_ci
376855e09eSopenharmony_ci<!-- tocstop -->
386855e09eSopenharmony_ci
396855e09eSopenharmony_ci## Example
406855e09eSopenharmony_ci
416855e09eSopenharmony_ci[Hexadecimal color](https://developer.mozilla.org/en-US/docs/Web/CSS/color) parser:
426855e09eSopenharmony_ci
436855e09eSopenharmony_ci```rust
446855e09eSopenharmony_ciextern crate nom;
456855e09eSopenharmony_ciuse nom::{
466855e09eSopenharmony_ci  IResult,
476855e09eSopenharmony_ci  bytes::complete::{tag, take_while_m_n},
486855e09eSopenharmony_ci  combinator::map_res,
496855e09eSopenharmony_ci  sequence::tuple
506855e09eSopenharmony_ci};
516855e09eSopenharmony_ci
526855e09eSopenharmony_ci#[derive(Debug,PartialEq)]
536855e09eSopenharmony_cipub struct Color {
546855e09eSopenharmony_ci  pub red:   u8,
556855e09eSopenharmony_ci  pub green: u8,
566855e09eSopenharmony_ci  pub blue:  u8,
576855e09eSopenharmony_ci}
586855e09eSopenharmony_ci
596855e09eSopenharmony_cifn from_hex(input: &str) -> Result<u8, std::num::ParseIntError> {
606855e09eSopenharmony_ci  u8::from_str_radix(input, 16)
616855e09eSopenharmony_ci}
626855e09eSopenharmony_ci
636855e09eSopenharmony_cifn is_hex_digit(c: char) -> bool {
646855e09eSopenharmony_ci  c.is_digit(16)
656855e09eSopenharmony_ci}
666855e09eSopenharmony_ci
676855e09eSopenharmony_cifn hex_primary(input: &str) -> IResult<&str, u8> {
686855e09eSopenharmony_ci  map_res(
696855e09eSopenharmony_ci    take_while_m_n(2, 2, is_hex_digit),
706855e09eSopenharmony_ci    from_hex
716855e09eSopenharmony_ci  )(input)
726855e09eSopenharmony_ci}
736855e09eSopenharmony_ci
746855e09eSopenharmony_cifn hex_color(input: &str) -> IResult<&str, Color> {
756855e09eSopenharmony_ci  let (input, _) = tag("#")(input)?;
766855e09eSopenharmony_ci  let (input, (red, green, blue)) = tuple((hex_primary, hex_primary, hex_primary))(input)?;
776855e09eSopenharmony_ci
786855e09eSopenharmony_ci  Ok((input, Color { red, green, blue }))
796855e09eSopenharmony_ci}
806855e09eSopenharmony_ci
816855e09eSopenharmony_cifn main() {}
826855e09eSopenharmony_ci
836855e09eSopenharmony_ci#[test]
846855e09eSopenharmony_cifn parse_color() {
856855e09eSopenharmony_ci  assert_eq!(hex_color("#2F14DF"), Ok(("", Color {
866855e09eSopenharmony_ci    red: 47,
876855e09eSopenharmony_ci    green: 20,
886855e09eSopenharmony_ci    blue: 223,
896855e09eSopenharmony_ci  })));
906855e09eSopenharmony_ci}
916855e09eSopenharmony_ci```
926855e09eSopenharmony_ci
936855e09eSopenharmony_ci## Documentation
946855e09eSopenharmony_ci
956855e09eSopenharmony_ci- [Reference documentation](https://docs.rs/nom)
966855e09eSopenharmony_ci- [Various design documents and tutorials](https://github.com/Geal/nom/tree/main/doc)
976855e09eSopenharmony_ci- [List of combinators and their behaviour](https://github.com/Geal/nom/blob/main/doc/choosing_a_combinator.md)
986855e09eSopenharmony_ci
996855e09eSopenharmony_ciIf you need any help developing your parsers, please ping `geal` on IRC (libera, geeknode, oftc), go to `#nom-parsers` on Libera IRC, or on the [Gitter chat room](https://gitter.im/Geal/nom).
1006855e09eSopenharmony_ci
1016855e09eSopenharmony_ci## Why use nom
1026855e09eSopenharmony_ci
1036855e09eSopenharmony_ciIf you want to write:
1046855e09eSopenharmony_ci
1056855e09eSopenharmony_ci### Binary format parsers
1066855e09eSopenharmony_ci
1076855e09eSopenharmony_cinom was designed to properly parse binary formats from the beginning. Compared
1086855e09eSopenharmony_cito the usual handwritten C parsers, nom parsers are just as fast, free from
1096855e09eSopenharmony_cibuffer overflow vulnerabilities, and handle common patterns for you:
1106855e09eSopenharmony_ci
1116855e09eSopenharmony_ci- [TLV](https://en.wikipedia.org/wiki/Type-length-value)
1126855e09eSopenharmony_ci- Bit level parsing
1136855e09eSopenharmony_ci- Hexadecimal viewer in the debugging macros for easy data analysis
1146855e09eSopenharmony_ci- Streaming parsers for network formats and huge files
1156855e09eSopenharmony_ci
1166855e09eSopenharmony_ciExample projects:
1176855e09eSopenharmony_ci
1186855e09eSopenharmony_ci- [FLV parser](https://github.com/rust-av/flavors)
1196855e09eSopenharmony_ci- [Matroska parser](https://github.com/rust-av/matroska)
1206855e09eSopenharmony_ci- [tar parser](https://github.com/Keruspe/tar-parser.rs)
1216855e09eSopenharmony_ci
1226855e09eSopenharmony_ci### Text format parsers
1236855e09eSopenharmony_ci
1246855e09eSopenharmony_ciWhile nom was made for binary format at first, it soon grew to work just as
1256855e09eSopenharmony_ciwell with text formats. From line based formats like CSV, to more complex, nested
1266855e09eSopenharmony_ciformats such as JSON, nom can manage it, and provides you with useful tools:
1276855e09eSopenharmony_ci
1286855e09eSopenharmony_ci- Fast case insensitive comparison
1296855e09eSopenharmony_ci- Recognizers for escaped strings
1306855e09eSopenharmony_ci- Regular expressions can be embedded in nom parsers to represent complex character patterns succinctly
1316855e09eSopenharmony_ci- Special care has been given to managing non ASCII characters properly
1326855e09eSopenharmony_ci
1336855e09eSopenharmony_ciExample projects:
1346855e09eSopenharmony_ci
1356855e09eSopenharmony_ci- [HTTP proxy](https://github.com/sozu-proxy/sozu/tree/main/lib/src/protocol/http/parser)
1366855e09eSopenharmony_ci- [TOML parser](https://github.com/joelself/tomllib)
1376855e09eSopenharmony_ci
1386855e09eSopenharmony_ci### Programming language parsers
1396855e09eSopenharmony_ci
1406855e09eSopenharmony_ciWhile programming language parsers are usually written manually for more
1416855e09eSopenharmony_ciflexibility and performance, nom can be (and has been successfully) used
1426855e09eSopenharmony_cias a prototyping parser for a language.
1436855e09eSopenharmony_ci
1446855e09eSopenharmony_cinom will get you started quickly with powerful custom error types, that you
1456855e09eSopenharmony_cican leverage with [nom_locate](https://github.com/fflorent/nom_locate) to
1466855e09eSopenharmony_cipinpoint the exact line and column of the error. No need for separate
1476855e09eSopenharmony_citokenizing, lexing and parsing phases: nom can automatically handle whitespace
1486855e09eSopenharmony_ciparsing, and construct an AST in place.
1496855e09eSopenharmony_ci
1506855e09eSopenharmony_ciExample projects:
1516855e09eSopenharmony_ci
1526855e09eSopenharmony_ci- [PHP VM](https://github.com/tagua-vm/parser)
1536855e09eSopenharmony_ci- eve language prototype
1546855e09eSopenharmony_ci- [xshade shading language](https://github.com/xshade-lang/xshade/)
1556855e09eSopenharmony_ci
1566855e09eSopenharmony_ci### Streaming formats
1576855e09eSopenharmony_ci
1586855e09eSopenharmony_ciWhile a lot of formats (and the code handling them) assume that they can fit
1596855e09eSopenharmony_cithe complete data in memory, there are formats for which we only get a part
1606855e09eSopenharmony_ciof the data at once, like network formats, or huge files.
1616855e09eSopenharmony_cinom has been designed for a correct behaviour with partial data: If there is
1626855e09eSopenharmony_cinot enough data to decide, nom will tell you it needs more instead of silently
1636855e09eSopenharmony_cireturning a wrong result. Whether your data comes entirely or in chunks, the
1646855e09eSopenharmony_ciresult should be the same.
1656855e09eSopenharmony_ci
1666855e09eSopenharmony_ciIt allows you to build powerful, deterministic state machines for your protocols.
1676855e09eSopenharmony_ci
1686855e09eSopenharmony_ciExample projects:
1696855e09eSopenharmony_ci
1706855e09eSopenharmony_ci- [HTTP proxy](https://github.com/sozu-proxy/sozu/tree/main/lib/src/protocol/http/parser)
1716855e09eSopenharmony_ci- [Using nom with generators](https://github.com/Geal/generator_nom)
1726855e09eSopenharmony_ci
1736855e09eSopenharmony_ci## Parser combinators
1746855e09eSopenharmony_ci
1756855e09eSopenharmony_ciParser combinators are an approach to parsers that is very different from
1766855e09eSopenharmony_cisoftware like [lex](https://en.wikipedia.org/wiki/Lex_(software)) and
1776855e09eSopenharmony_ci[yacc](https://en.wikipedia.org/wiki/Yacc). Instead of writing the grammar
1786855e09eSopenharmony_ciin a separate file and generating the corresponding code, you use very
1796855e09eSopenharmony_cismall functions with very specific purpose, like "take 5 bytes", or
1806855e09eSopenharmony_ci"recognize the word 'HTTP'", and assemble them in meaningful patterns
1816855e09eSopenharmony_cilike "recognize 'HTTP', then a space, then a version".
1826855e09eSopenharmony_ciThe resulting code is small, and looks like the grammar you would have
1836855e09eSopenharmony_ciwritten with other parser approaches.
1846855e09eSopenharmony_ci
1856855e09eSopenharmony_ciThis has a few advantages:
1866855e09eSopenharmony_ci
1876855e09eSopenharmony_ci- The parsers are small and easy to write
1886855e09eSopenharmony_ci- The parsers components are easy to reuse (if they're general enough, please add them to nom!)
1896855e09eSopenharmony_ci- The parsers components are easy to test separately (unit tests and property-based tests)
1906855e09eSopenharmony_ci- The parser combination code looks close to the grammar you would have written
1916855e09eSopenharmony_ci- You can build partial parsers, specific to the data you need at the moment, and ignore the rest
1926855e09eSopenharmony_ci
1936855e09eSopenharmony_ci## Technical features
1946855e09eSopenharmony_ci
1956855e09eSopenharmony_cinom parsers are for:
1966855e09eSopenharmony_ci- [x] **byte-oriented**: The basic type is `&[u8]` and parsers will work as much as possible on byte array slices (but are not limited to them)
1976855e09eSopenharmony_ci- [x] **bit-oriented**: nom can address a byte slice as a bit stream
1986855e09eSopenharmony_ci- [x] **string-oriented**: The same kind of combinators can apply on UTF-8 strings as well
1996855e09eSopenharmony_ci- [x] **zero-copy**: If a parser returns a subset of its input data, it will return a slice of that input, without copying
2006855e09eSopenharmony_ci- [x] **streaming**: nom can work on partial data and detect when it needs more data to produce a correct result
2016855e09eSopenharmony_ci- [x] **descriptive errors**: The parsers can aggregate a list of error codes with pointers to the incriminated input slice. Those error lists can be pattern matched to provide useful messages.
2026855e09eSopenharmony_ci- [x] **custom error types**: You can provide a specific type to improve errors returned by parsers
2036855e09eSopenharmony_ci- [x] **safe parsing**: nom leverages Rust's safe memory handling and powerful types, and parsers are routinely fuzzed and tested with real world data. So far, the only flaws found by fuzzing were in code written outside of nom
2046855e09eSopenharmony_ci- [x] **speed**: Benchmarks have shown that nom parsers often outperform many parser combinators library like Parsec and attoparsec, some regular expression engines and even handwritten C parsers
2056855e09eSopenharmony_ci
2066855e09eSopenharmony_ciSome benchmarks are available on [Github](https://github.com/Geal/nom_benchmarks).
2076855e09eSopenharmony_ci
2086855e09eSopenharmony_ci## Rust version requirements (MSRV)
2096855e09eSopenharmony_ci
2106855e09eSopenharmony_ciThe 7.0 series of nom supports **Rustc version 1.48 or greater**. It is known to work properly on Rust 1.41.1 but there is no guarantee it will stay the case through this major release.
2116855e09eSopenharmony_ci
2126855e09eSopenharmony_ciThe current policy is that this will only be updated in the next major nom release.
2136855e09eSopenharmony_ci
2146855e09eSopenharmony_ci## Installation
2156855e09eSopenharmony_ci
2166855e09eSopenharmony_cinom is available on [crates.io](https://crates.io/crates/nom) and can be included in your Cargo enabled project like this:
2176855e09eSopenharmony_ci
2186855e09eSopenharmony_ci```toml
2196855e09eSopenharmony_ci[dependencies]
2206855e09eSopenharmony_cinom = "7"
2216855e09eSopenharmony_ci```
2226855e09eSopenharmony_ci
2236855e09eSopenharmony_ciThere are a few compilation features:
2246855e09eSopenharmony_ci
2256855e09eSopenharmony_ci* `alloc`: (activated by default) if disabled, nom can work in `no_std` builds without memory allocators. If enabled, combinators that allocate (like `many0`) will be available
2266855e09eSopenharmony_ci* `std`: (activated by default, activates `alloc` too) if disabled, nom can work in `no_std` builds
2276855e09eSopenharmony_ci
2286855e09eSopenharmony_ciYou can configure those features like this:
2296855e09eSopenharmony_ci
2306855e09eSopenharmony_ci```toml
2316855e09eSopenharmony_ci[dependencies.nom]
2326855e09eSopenharmony_civersion = "7"
2336855e09eSopenharmony_cidefault-features = false
2346855e09eSopenharmony_cifeatures = ["alloc"]
2356855e09eSopenharmony_ci```
2366855e09eSopenharmony_ci
2376855e09eSopenharmony_ci# Related projects
2386855e09eSopenharmony_ci
2396855e09eSopenharmony_ci- [Get line and column info in nom's input type](https://github.com/fflorent/nom_locate)
2406855e09eSopenharmony_ci- [Using nom as lexer and parser](https://github.com/Rydgel/monkey-rust)
2416855e09eSopenharmony_ci
2426855e09eSopenharmony_ci# Parsers written with nom
2436855e09eSopenharmony_ci
2446855e09eSopenharmony_ciHere is a (non exhaustive) list of known projects using nom:
2456855e09eSopenharmony_ci
2466855e09eSopenharmony_ci- Text file formats: [Ceph Crush](https://github.com/cholcombe973/crushtool),
2476855e09eSopenharmony_ci[Cronenberg](https://github.com/ayrat555/cronenberg),
2486855e09eSopenharmony_ci[XFS Runtime Stats](https://github.com/ChrisMacNaughton/xfs-rs),
2496855e09eSopenharmony_ci[CSV](https://github.com/GuillaumeGomez/csv-parser),
2506855e09eSopenharmony_ci[FASTA](https://github.com/TianyiShi2001/nom-fasta),
2516855e09eSopenharmony_ci[FASTQ](https://github.com/elij/fastq.rs),
2526855e09eSopenharmony_ci[INI](https://github.com/Geal/nom/blob/main/tests/ini.rs),
2536855e09eSopenharmony_ci[ISO 8601 dates](https://github.com/badboy/iso8601),
2546855e09eSopenharmony_ci[libconfig-like configuration file format](https://github.com/filipegoncalves/rust-config),
2556855e09eSopenharmony_ci[Web archive](https://github.com/sbeckeriv/warc_nom_parser),
2566855e09eSopenharmony_ci[PDB](https://github.com/TianyiShi2001/nom-pdb),
2576855e09eSopenharmony_ci[proto files](https://github.com/tafia/protobuf-parser),
2586855e09eSopenharmony_ci[Fountain screenplay markup](https://github.com/adamchalmers/fountain-rs),
2596855e09eSopenharmony_ci[vimwiki](https://github.com/chipsenkbeil/vimwiki-server/tree/master/vimwiki) & [vimwiki_macros](https://github.com/chipsenkbeil/vimwiki-server/tree/master/vimwiki_macros)
2606855e09eSopenharmony_ci- Programming languages:
2616855e09eSopenharmony_ci[PHP](https://github.com/tagua-vm/parser),
2626855e09eSopenharmony_ci[Basic Calculator](https://github.com/balajisivaraman/basic_calculator_rs),
2636855e09eSopenharmony_ci[GLSL](https://github.com/phaazon/glsl),
2646855e09eSopenharmony_ci[Lua](https://github.com/doomrobo/nom-lua53),
2656855e09eSopenharmony_ci[Python](https://github.com/ProgVal/rust-python-parser),
2666855e09eSopenharmony_ci[SQL](https://github.com/ms705/nom-sql),
2676855e09eSopenharmony_ci[Elm](https://github.com/cout970/Elm-interpreter),
2686855e09eSopenharmony_ci[SystemVerilog](https://github.com/dalance/sv-parser),
2696855e09eSopenharmony_ci[Turtle](https://github.com/vandenoever/rome/tree/master/src/io/turtle),
2706855e09eSopenharmony_ci[CSML](https://github.com/CSML-by-Clevy/csml-interpreter),
2716855e09eSopenharmony_ci[Wasm](https://github.com/Strytyp/wasm-nom),
2726855e09eSopenharmony_ci[Pseudocode](https://github.com/Gungy2/pseudocode)
2736855e09eSopenharmony_ci[Filter for MeiliSearch](https://github.com/meilisearch/meilisearch)
2746855e09eSopenharmony_ci- Interface definition formats: [Thrift](https://github.com/thehydroimpulse/thrust)
2756855e09eSopenharmony_ci- Audio, video and image formats:
2766855e09eSopenharmony_ci[GIF](https://github.com/Geal/gif.rs),
2776855e09eSopenharmony_ci[MagicaVoxel .vox](https://github.com/davidedmonds/dot_vox),
2786855e09eSopenharmony_ci[midi](https://github.com/derekdreery/nom-midi-rs),
2796855e09eSopenharmony_ci[SWF](https://github.com/open-flash/swf-parser),
2806855e09eSopenharmony_ci[WAVE](http://github.com/noise-Labs/wave),
2816855e09eSopenharmony_ci[Matroska (MKV)](https://github.com/rust-av/matroska)
2826855e09eSopenharmony_ci- Document formats:
2836855e09eSopenharmony_ci[TAR](https://github.com/Keruspe/tar-parser.rs),
2846855e09eSopenharmony_ci[GZ](https://github.com/nharward/nom-gzip),
2856855e09eSopenharmony_ci[GDSII](https://github.com/erihsu/gds2-io)
2866855e09eSopenharmony_ci- Cryptographic formats:
2876855e09eSopenharmony_ci[X.509](https://github.com/rusticata/x509-parser)
2886855e09eSopenharmony_ci- Network protocol formats:
2896855e09eSopenharmony_ci[Bencode](https://github.com/jbaum98/bencode.rs),
2906855e09eSopenharmony_ci[D-Bus](https://github.com/toshokan/misato),
2916855e09eSopenharmony_ci[DHCP](https://github.com/rusticata/dhcp-parser),
2926855e09eSopenharmony_ci[HTTP](https://github.com/sozu-proxy/sozu/tree/main/lib/src/protocol/http),
2936855e09eSopenharmony_ci[URI](https://github.com/santifa/rrp/blob/master/src/uri.rs),
2946855e09eSopenharmony_ci[IMAP](https://github.com/djc/tokio-imap),
2956855e09eSopenharmony_ci[IRC](https://github.com/Detegr/RBot-parser),
2966855e09eSopenharmony_ci[Pcap-NG](https://github.com/richo/pcapng-rs),
2976855e09eSopenharmony_ci[Pcap](https://github.com/ithinuel/pcap-rs),
2986855e09eSopenharmony_ci[Pcap + PcapNG](https://github.com/rusticata/pcap-parser),
2996855e09eSopenharmony_ci[IKEv2](https://github.com/rusticata/ipsec-parser),
3006855e09eSopenharmony_ci[NTP](https://github.com/rusticata/ntp-parser),
3016855e09eSopenharmony_ci[SNMP](https://github.com/rusticata/snmp-parser),
3026855e09eSopenharmony_ci[Kerberos v5](https://github.com/rusticata/kerberos-parser),
3036855e09eSopenharmony_ci[DER](https://github.com/rusticata/der-parser),
3046855e09eSopenharmony_ci[TLS](https://github.com/rusticata/tls-parser),
3056855e09eSopenharmony_ci[IPFIX / Netflow v10](https://github.com/dominotree/rs-ipfix),
3066855e09eSopenharmony_ci[GTP](https://github.com/fuerstenau/gorrosion-gtp),
3076855e09eSopenharmony_ci[SIP](https://github.com/armatusmiles/sipcore/tree/master/crates/sipmsg),
3086855e09eSopenharmony_ci[Prometheus](https://github.com/timberio/vector/blob/master/lib/prometheus-parser/src/line.rs)
3096855e09eSopenharmony_ci- Language specifications:
3106855e09eSopenharmony_ci[BNF](https://github.com/snewt/bnf)
3116855e09eSopenharmony_ci- Misc formats:
3126855e09eSopenharmony_ci[Gameboy ROM](https://github.com/MarkMcCaskey/gameboy-rom-parser),
3136855e09eSopenharmony_ci[ANT FIT](https://github.com/stadelmanma/fitparse-rs),
3146855e09eSopenharmony_ci[Version Numbers](https://github.com/fosskers/rs-versions),
3156855e09eSopenharmony_ci[Telcordia/Bellcore SR-4731 SOR OTDR files](https://github.com/JamesHarrison/otdrs),
3166855e09eSopenharmony_ci[MySQL binary log](https://github.com/PrivateRookie/boxercrab),
3176855e09eSopenharmony_ci[URI](https://github.com/Skasselbard/nom-uri),
3186855e09eSopenharmony_ci[Furigana](https://github.com/sachaarbonel/furigana.rs),
3196855e09eSopenharmony_ci[Wordle Result](https://github.com/Fyko/wordle-stats/tree/main/parser)
3206855e09eSopenharmony_ci
3216855e09eSopenharmony_ciWant to create a new parser using `nom`? A list of not yet implemented formats is available [here](https://github.com/Geal/nom/issues/14).
3226855e09eSopenharmony_ci
3236855e09eSopenharmony_ciWant to add your parser here? Create a pull request for it!
3246855e09eSopenharmony_ci
3256855e09eSopenharmony_ci# Contributors
3266855e09eSopenharmony_ci
3276855e09eSopenharmony_cinom is the fruit of the work of many contributors over the years, many thanks for your help!
3286855e09eSopenharmony_ci
3296855e09eSopenharmony_ci<a href="https://github.com/geal/nom/graphs/contributors">
3306855e09eSopenharmony_ci  <img src="https://contributors-img.web.app/image?repo=geal/nom" />
3316855e09eSopenharmony_ci</a>
332