NOMは、Rustで書かれたパーサーコンビネーターライブラリです。その目標は、速度やメモリの消費を損なうことなく、安全なパーサーを構築するためのツールを提供することです。そのために、Rustの強いタイピングとメモリの安全性を広範囲に使用して、高速で正しいパーサーを生成し、機能、マクロ、特性を提供して、エラーが発生しやすい配管のほとんどを抽象化します。
NOMはあなたのファイルから喜んでバイトを取り除きます:)
16進数色パーサー:
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
pingして、Libera IRCの#nom-parsers
またはGitterチャットルームにアクセスしてください。
書きたい場合:
NOMは、最初からバイナリ形式を適切に解析するように設計されていました。通常の手書きのCパーサーと比較して、NOMパーサーは同じくらい速く、バッファーオーバーフローの脆弱性がなく、一般的なパターンを処理します。
プロジェクトの例:
NOMは最初はバイナリ形式で作成されましたが、すぐにテキスト形式でも機能するようになりました。 CSVなどのラインベースの形式から、JSONなどのより複雑でネストされた形式まで、NOMはそれを管理でき、有用なツールを提供します。
プロジェクトの例:
プログラミング言語パーサーは通常、より柔軟性とパフォーマンスのために手動で記述されますが、NOMは言語のプロトタイピングパーサーとして使用できます(そして成功しています)。
NOMは、強力なカスタムエラータイプから迅速に開始され、nom_locateを活用してエラーの正確な行と列を特定できます。個別のトークン化、レックス、解析フェーズ:NOMは自動的にホワイトスペースの解析を自動的に処理し、ASTを所定の位置に構築できます。
プロジェクトの例:
多くの形式(およびそれらを処理するコード)は、それらがメモリに完全なデータを適合させることができると想定していますが、ネットワーク形式や巨大なファイルなど、一度にデータの一部しか取得しない形式があります。 NOMは、部分的なデータを使用して正しい動作のために設計されています。決定するのに十分なデータがない場合、NOMは、誤って間違った結果を返すのではなく、もっと必要なことを伝えます。あなたのデータが完全に来るか、チャンクであるかにかかわらず、結果は同じでなければなりません。
これにより、プロトコル用の強力で決定論的な状態マシンを構築できます。
プロジェクトの例:
パーサーの組み合わせは、LexやYACCなどのソフトウェアとは非常に異なるパーサーへのアプローチです。文法を別のファイルに書き込み、対応するコードを生成する代わりに、「5バイトを取る」または「「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
を使用して新しいパーサーを作成したいですか?まだ実装されていないフォーマットのリストはこちらから入手できます。
ここにパーサーを追加したいですか?プルリクエストを作成してください!
ノムは長年にわたって多くの貢献者の仕事の果物であり、あなたの助けに感謝します!