NOM adalah perpustakaan parser Combinators yang ditulis dalam karat. Tujuannya adalah untuk menyediakan alat untuk membangun parser yang aman tanpa mengurangi kecepatan atau konsumsi memori. Untuk itu, ia menggunakan pengetikan dan keamanan memori yang kuat dari Rust untuk menghasilkan parser yang cepat dan benar, dan menyediakan fungsi, makro, dan sifat untuk mengabstraksikan sebagian besar pipa rentan kesalahan.
NOM akan dengan senang hati mengeluarkan byte dari file Anda :)
Hexadecimal Color Parser:
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 ,
}
) )
) ;
}
Jika Anda membutuhkan bantuan untuk mengembangkan parser Anda, silakan ping geal
di IRC (Libera, Geeknode, OFTC), kunjungi #nom-parsers
di Libera IRC, atau di ruang obrolan gitter.
Jika Anda ingin menulis:
NOM dirancang untuk menguraikan format biner dengan benar sejak awal. Dibandingkan dengan parser C tulisan tangan biasa, parser nom sama cepatnya, bebas dari kerentanan buffer overflow, dan menangani pola umum untuk Anda:
Contoh Proyek:
Sementara NOM dibuat untuk format biner pada awalnya, itu segera tumbuh dengan baik dengan format teks. Dari format berbasis garis seperti CSV, hingga format bersarang yang lebih kompleks seperti JSON, NOM dapat mengelolanya, dan memberi Anda alat yang berguna:
Contoh Proyek:
Sementara pemrograman parser bahasa biasanya ditulis secara manual untuk lebih banyak fleksibilitas dan kinerja, NOM dapat (dan telah berhasil) digunakan sebagai parser pembuatan prototipe untuk suatu bahasa.
NOM akan membuat Anda memulai dengan cepat dengan tipe kesalahan khusus yang kuat, yang dapat Anda manfaatkan dengan NOM_LOCATE untuk menentukan garis dan kolom kesalahan yang tepat. Tidak perlu untuk fase tokenizing, lexing, dan parsing terpisah: NOM dapat secara otomatis menangani penguraian whitespace, dan membangun AST di tempatnya.
Contoh Proyek:
Sementara banyak format (dan kode yang menangani mereka) berasumsi bahwa mereka dapat sesuai dengan data lengkap dalam memori, ada format yang kita hanya mendapatkan bagian dari data sekaligus, seperti format jaringan, atau file besar. NOM telah dirancang untuk perilaku yang benar dengan data parsial: jika tidak ada cukup data untuk memutuskan, NOM akan memberi tahu Anda bahwa itu membutuhkan lebih banyak daripada secara diam -diam mengembalikan hasil yang salah. Apakah data Anda sepenuhnya atau dalam potongan, hasilnya harus sama.
Ini memungkinkan Anda untuk membangun mesin negara yang kuat dan deterministik untuk protokol Anda.
Contoh Proyek:
Parser Combinator adalah pendekatan untuk parser yang sangat berbeda dari perangkat lunak seperti Lex dan YACC. Alih -alih menulis tata bahasa dalam file terpisah dan menghasilkan kode yang sesuai, Anda menggunakan fungsi yang sangat kecil dengan tujuan yang sangat spesifik, seperti "ambil 5 byte", atau "mengenali kata 'http'", dan merakitnya dalam pola yang bermakna seperti " Kenali 'http', lalu ruang, lalu versi ". Kode yang dihasilkan kecil, dan terlihat seperti tata bahasa yang akan Anda tulis dengan pendekatan parser lainnya.
Ini memiliki beberapa keunggulan:
Parsers nom adalah untuk:
&[u8]
dan parser akan bekerja sebanyak mungkin pada irisan array byte (tetapi tidak terbatas pada mereka) Beberapa tolok ukur tersedia di GitHub.
Seri 7,0 NOM mendukung RustC Versi 1.56 atau lebih besar .
Kebijakan saat ini adalah bahwa ini hanya akan diperbarui dalam rilis NOM utama berikutnya.
NOM tersedia di Crates.io dan dapat dimasukkan dalam proyek yang diaktifkan kargo Anda seperti ini:
[ dependencies ]
nom = " 7 "
Ada beberapa fitur kompilasi:
alloc
: (diaktifkan secara default) Jika dinonaktifkan, NOM dapat bekerja di no_std
BUILD tanpa alokasi memori. Jika diaktifkan, kombinator yang mengalokasikan (seperti many0
) akan tersediastd
: (diaktifkan secara default, aktifkan alloc
juga) jika dinonaktifkan, NOM dapat bekerja di no_std
buildsAnda dapat mengonfigurasi fitur -fitur seperti ini:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Berikut adalah daftar proyek yang diketahui (tidak lengkap) menggunakan NOM:
Ingin membuat parser baru menggunakan nom
? Daftar format yang belum diimplementasikan tersedia di sini.
Ingin menambahkan parser Anda di sini? Buat permintaan tarik untuk itu!
Nom adalah buah dari banyak kontributor selama bertahun -tahun, terima kasih banyak atas bantuan Anda!