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是多年來許多貢獻者的工作的果實,非常感謝您的幫助!