nom Rust 解析器组合器框架开源项目

我要开发同款
白开水不加糖2022年04月28日
71阅读
开发技术Rust
所属分类常用工具包、程序开发
授权协议MIT

作品详情

nom是一个用Rust编写的解析器组合库。它的目标是在不影响速度或内存消耗的情况下提供构建安全解析器的工具。为此,它广泛使用Rust的强类型和内存安全来生成快速和正确的解析器,并提供函数、宏和特征来抽象大多数容易出错的管道。

Hexadecimalcolor parser:

externcratenom;usenom::{IResult,bytes::complete::{tag,take_while_m_n},combinator::map_res,sequence::tuple};#[derive(Debug,PartialEq)]pubstructColor{pubred:u8,pubgreen:u8,pubblue:u8,}fnfrom_hex(input:&str)->Result<u8,std::num::ParseIntError>{u8::from_str_radix(input,16)}fnis_hex_digit(c:char)->bool{c.is_digit(16)}fnhex_primary(input:&str)->IResult<&str,u8>{map_res(take_while_m_n(2,2,is_hex_digit),from_hex)(input)}fnhex_color(input:&str)->IResult<&str,Color>{let(input,_)=tag("#")(input)?;let(input,(red,green,blue))=tuple((hex_primary,hex_primary,hex_primary))(input)?;Ok((input,Color{red,green,blue}))}fnmain(){}#[test]fnparse_color(){assert_eq!(hex_color("#2F14DF"),Ok(("",Color{red:47,green:20,blue:223,})));}nom解析器用于:

byte-oriented:基本类型是&[u8],解析器将尽可能在字节数组片上工作(但不限于此)。bit-oriented:nom可以将一个字节片作为一个比特流来处理。string-oriented:同样的组合器也可以适用于UTF-8字符串。zero-copy:如果一个分析器返回其输入数据的一个子集,它将返回该输入的一个片断,而不进行复制。streaming:nom可以在部分数据上工作,并检测它何时需要更多的数据来产生正确的结果。descriptiveerrors:解析器可以聚合错误代码列表以及指向受控输入切片的指针。这些错误列表可以进行模式匹配以提供有用的消息。customerrortypes:你可以提供一个特定的类型来改进解析器返回的错误。safeparsing:nom利用Rust的安全内存处理和强大的类型,解析器经常被模糊处理,并用真实世界的数据进行测试。到目前为止,模糊测试发现的唯一缺陷是在nom之外编写的代码。speed:基准测试表明,nom解析器的性能通常优于许多解析器组合库,如Parsec和attoparsec,一些正则表达式引擎,甚至手写的C解析器。

Github 上提供了一些基准测试。

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论