NOM是用Rust编写的解析器组合图书馆。它的目标是提供工具来构建安全解析器,而不会损害速度或内存消耗。为此,它使用了广泛的Rust的强大打字和记忆安全性来产生快速和纠正的解析器,并提供功能,宏和特征来抽象大多数易于容易发生管道。
NOM会很高兴地从您的文件中取出一个字节:)
十六进制的颜色解析器:
use nom :: {
bytes :: complete :: { tag , take_while_m_n } ,
combinator :: map_res ,
sequence :: Tuple ,
IResult ,
Parser ,
} ;
# [ derive ( Debug , PartialEq ) ]
pub struct Color {
pub red : u8 ,
pub green : u8 ,
pub blue : u8 ,
}
fn from_hex ( input : & str ) -> Result < u8 , std :: num :: ParseIntError > {
u8 :: from_str_radix ( input , 16 )
}
fn is_hex_digit ( c : char ) -> bool {
c . is_digit ( 16 )
}
fn hex_primary ( input : & str ) -> IResult < & str , u8 > {
map_res (
take_while_m_n ( 2 , 2 , is_hex_digit ) ,
from_hex
) . parse ( input )
}
fn hex_color ( input : & str ) -> IResult < & str , Color > {
let ( input , _ ) = tag ( "#" ) ( input ) ? ;
let ( input , ( red , green , blue ) ) = ( hex_primary , hex_primary , hex_primary ) . parse ( input ) ? ;
Ok ( ( input , Color { red , green , blue } ) )
}
fn main ( ) {
println ! ( "{:?}" , hex_color ( "#2F14DF" ) )
}
# [ test ]
fn parse_color ( ) {
assert_eq ! (
hex_color ( "#2F14DF" ) ,
Ok ( (
"" ,
Color {
red: 47 ,
green: 20 ,
blue: 223 ,
}
) )
) ;
}
如果您需要任何帮助开发解析器的帮助,请在IRC(Libera,Geeknode,oftc)上使用geal
,转到Libera IRC上的#nom-parsers
或Gitter聊天室。
如果您想写信:
NOM旨在从一开始就正确解析二进制格式。与通常的手写C解析器相比,NOM解析器同样快,没有缓冲区溢出漏洞,并为您处理常见模式:
示例项目:
虽然NOM首先是为二进制格式而制作的,但它很快就可以与文本格式一起工作。从CSV等基于线路的格式到更复杂的嵌套格式,例如JSON,NOM可以管理它,并为您提供有用的工具:
示例项目:
虽然通常手动编写编程语言解析器以提高灵活性和性能,但NOM可以(并已成功)用作一种语言的原型解析器。
NOM将通过功能强大的自定义错误类型快速启动,您可以使用nom_locate利用该类型来查明错误的确切行和列。无需单独的令牌化,Lexing和解析阶段:NOM可以自动处理Whitespace解析,并构建AST。
示例项目:
虽然许多格式(以及处理它们的代码)假定它们可以在内存中拟合完整的数据,但有一些格式,我们只能一次获得一部分数据,例如网络格式或庞大的文件。 NOM的设计是针对正确数据的正确行为:如果没有足够的数据来决定,NOM会告诉您它需要更多,而不是默默地返回错误的结果。无论您的数据是完全或块中的,结果都应该相同。
它使您可以为协议构建强大的确定性状态机。
示例项目:
解析器组合器是一种与LEX和YACC等软件截然不同的解析器的方法。您没有在单独的文件中编写语法并生成相应的代码,而是使用具有非常具体目的的非常小的函数,例如“ take 5 byt”或“识别'http'”一词,并以有意义的模式组装它们,例如”识别“ HTTP”,然后是一个空间,然后是版本”。最终的代码很小,看起来您会用其他解析器方法编写的语法。
这有一些优势:
NOM解析器适用于:
&[u8]
,而解析器将在字节阵列切片上尽可能多地工作(但不限于它们) GitHub上有一些基准。
7.0系列的NOM支持Rustc版本1.56或更高版本。
当前的政策是,这只会在下一个主要NOM版本中进行更新。
NOM可在Crates.io上使用,可以包含在您的启用货物的项目中:
[ dependencies ]
nom = " 7 "
有一些汇编功能:
alloc
:(默认情况下激活)如果禁用,NOM可以在没有内存分配器的情况下在no_std
构建中工作。如果启用,将可用(像many0
)分配的组合器可用std
:(默认激活,也激活alloc
)如果禁用,NOM可以在no_std
构建中工作您可以配置这样的功能:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
这是使用NOM的已知项目的(非详尽)列表:
想使用nom
创建新的解析器吗?此处可用尚未实现格式的列表。
想在这里添加您的解析器吗?为其创建拉动请求!
NOM是多年来许多贡献者的工作的果实,非常感谢您的帮助!