16855e09eSopenharmony_ci# nom, eating data byte by byte 26855e09eSopenharmony_ci 36855e09eSopenharmony_ci[](LICENSE) 46855e09eSopenharmony_ci[](https://gitter.im/Geal/nom?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 56855e09eSopenharmony_ci[](https://github.com/Geal/nom/actions/workflows/ci.yml) 66855e09eSopenharmony_ci[](https://coveralls.io/github/Geal/nom?branch=main) 76855e09eSopenharmony_ci[](https://crates.io/crates/nom) 86855e09eSopenharmony_ci[](#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 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