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 上提供了一些基准测试。
评论