NOM هي مكتبة Combinators محلل مكتوبة في الصدأ. هدفها هو توفير أدوات لبناء محلات آمنة دون المساس بالسرعة أو استهلاك الذاكرة. تحقيقًا لهذه الغاية ، فإنه يستخدم على نطاق واسع في الكتابة القوية للذاكرة وسلامة الذاكرة في 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 ,
}
) )
) ;
}
إذا كنت بحاجة إلى أي مساعدة في تطوير تحليلاتك ، فيرجى ping geal
على IRC (Libera ، Geeknode ، OFTC) ، أو انتقل إلى #nom-parsers
on Libera IRC ، أو في غرفة الدردشة الجيتر.
إذا كنت تريد الكتابة:
تم تصميم NOM لتحليل التنسيقات الثنائية بشكل صحيح من البداية. بالمقارنة مع محلات C المكتوبة بخط اليد المعتادة ، فإن محلات NOM هي بنفس السرعة ، وخالية من نقاط الضعف في التدفق العازلة ، والتعامل مع الأنماط الشائعة لك:
مشاريع مثال:
في حين تم صنع NOM للتنسيق الثنائي في البداية ، إلا أنه سرعان ما نما للعمل تمامًا مع تنسيقات النص. من التنسيقات القائمة على الخط مثل CSV ، إلى تنسيقات أكثر تعقيدًا وتداخلًا مثل JSON ، يمكن لـ NOM إدارتها ، وتوفر لك أدوات مفيدة:
مشاريع مثال:
بينما تتم كتابة محلات لغة البرمجة عادةً يدويًا لمزيد من المرونة والأداء ، يمكن استخدام NOM (وقد تم بنجاح) كحامل النماذج الأولية للغة.
ستبدأ NOM بسرعة مع أنواع الأخطاء المخصصة القوية ، بحيث يمكنك الاستفادة من NOM_LOCATE لتحديد الخط الدقيق وعمود الخطأ. لا حاجة إلى مراحل الرمز المميز والرمز المميز والتحليل: يمكن لـ NOM التعامل تلقائيًا مع تحليل المساحة البيضاء ، وبناء AST في مكانه.
مشاريع مثال:
على الرغم من أن الكثير من التنسيقات (والرمز المعالجة لهم) تفترض أنها يمكن أن تناسب البيانات الكاملة في الذاكرة ، إلا أن هناك تنسيقات نحصل عليها فقط جزء من البيانات في وقت واحد ، مثل تنسيقات الشبكة أو الملفات الضخمة. تم تصميم NOM لسلوك صحيح مع بيانات جزئية: إذا لم تكن هناك بيانات كافية لتقريرها ، فسوف يخبرك NOM بأنه يحتاج إلى المزيد بدلاً من إرجاع نتيجة خاطئة بصمت. سواء كانت بياناتك تأتي بالكامل أو في قطع ، يجب أن تكون النتيجة هي نفسها.
يسمح لك ببناء آلات حالة قوية وحتمية لبروتوكولاتك.
مشاريع مثال:
تعتبر مجموعات المحللات المحليين مقاربة تجاه المحللين الذين يختلفون تمامًا عن برامج مثل LEX و YACC. بدلاً من كتابة القواعد النحوية في ملف منفصل وإنشاء الكود المقابل ، يمكنك استخدام وظائف صغيرة جدًا ذات غرض محدد للغاية ، مثل "Take 5 Bytes" ، أو "التعرف على كلمة" http "، وتجميعها في أنماط ذات معنى مثل" تعرف على "HTTP" ، ثم مساحة ، ثم نسخة ". الكود الناتج صغير ، ويبدو وكأنه القواعد التي كنت قد كتبت مع أساليب محلل آخر.
هذا له بعض المزايا:
محللون NOM من أجل:
&[u8]
وسيعمل المحللون قدر الإمكان على شرائح صفيف البايت (على سبيل المثال لا الحصر) بعض المعايير متوفرة على جيثب.
سلسلة 7.0 من NOM تدعم Rustc الإصدار 1.56 أو أكثر .
السياسة الحالية هي أنه سيتم تحديث هذا فقط في إصدار NOM الرئيسي التالي.
NOM متوفر على Catse.io ويمكن تضمينه في مشروع تمكين البضائع الخاص بك مثل هذا:
[ dependencies ]
nom = " 7 "
هناك بعض ميزات التجميع:
alloc
: (تم تنشيطه افتراضيًا) إذا تم تعطيله ، يمكن لـ NOM العمل في no_std
يبني بدون مخصصات للذاكرة. إذا تم تمكينها ، فستتوفر المجموعات التي تخصص (مثل many0
)std
: (تم تنشيطه افتراضيًا ، ينشط alloc
أيضًا) إذا تم تعطيله ، يمكن لـ NOM العمل في no_std
Buildsيمكنك تكوين تلك الميزات مثل هذا:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
فيما يلي قائمة (غير شاملة) من المشاريع المعروفة باستخدام NOM:
هل تريد إنشاء محلل جديد باستخدام nom
؟ تتوفر قائمة بتنسيقات لم يتم تنفيذها بعد هنا.
تريد إضافة محلل الخاص بك هنا؟ إنشاء طلب سحب لذلك!
NOM هي ثمرة عمل العديد من المساهمين على مر السنين ، شكرا جزيلا لمساعدتكم!