تحليل الأعداد
لبات 0.7.0 · الإصدار الحالي
حلل نص عدد صحيح بقواعد صارمة، وافحص الفرع المناسب، وأعد المحاولة بعد إدخال غير صالح.
محتويات الصفحة
ما ستتعلمه
حلل نصا صحيحا بقواعد صارمة، واقرأ فرع النتيجة المناسب، وأعد المحاولة بعد إدخال غير صالح. اشرح لماذا يفشل 12x بينما يطبع الرد التالي 41 العدد 42.
قبل أن تبدأ
اقرأ إدخال النص والارتباطات والشروط والحلقات. يتضمن هذا المثال المستقل دالة دخوله وقالبا كاملا لمعالجة النتيجة. افتح مسودة جديدة في الرئيسية واختر تشغيل صراحة؛ تبقى المسودات السابقة متاحة.
نتيجة وحلقة إعادة المحاولة
تأخذ parse_i64 / حلل_ص64 سلسلة نصية وترجع result<i64> / نتيجة<ص64>. تحمل النتيجة إما قيمة عدد صحيح أو معلومات خطأ. تسمي الأقواس الزاوية نوع قيمة النجاح. تربط let parsed نتيجة جديدة في كل دورة. تظل read_line / اقرأ_سطر ترجع نصا؛ لا تحوله إلى عدد.
التنفيذ: المتصفح والمضيف الأصلي · لبات 0.7.0
- اقرأ شرح المثال في الدرس المرتبط قبل التشغيل.
أسطر الإدخال: ["12x","41"]
دالة ابدأ_الرئيسية() -> ص64 {
متغير معلق: منطقي = صواب.
طالما معلق {
اطبع("Number: ").
دع محلل: نتيجة<ص64> = حلل_ص64(اقرأ_سطر()).
إذا (محلل::نجاح) {
اطبع(نسق_ص64(محلل::قيمة + 1) + "\س").
معلق = خطأ.
} وإلا {
اطبع(محلل::الخطأ::الرمز + "\س").
}
}
أرجع 0.
}
النتائج المتوقعة
{
"browser": {
"check": "success",
"class": "success",
"output": "Number: invalid-number\nNumber: 42\n",
"processStatus": 0
},
"native": {
"check": 0,
"status": 0,
"output": "Number: invalid-number\nNumber: 42\n"
}
}تبدأ var pending: bool = true / متغير معلق: منطقي = صواب بعلامة منطقية قابلة للتغيير. تكرر while / طالما ما دامت العلامة صحيحة. تطبع كل دورة Number: وتقرأ سطرا واحدا. يصل العامل اللاحق :: إلى حقل في النتيجة. تمثل parsed::ok / محلل::نجاح اختبار النجاح المنطقي الذي تستخدمه if / إذا.
يقرأ فرع النجاح وحده parsed::value / محلل::قيمة، ويضيف 1، وينسق العدد الصحيح باستخدام format_i64 / نسق_ص64، ويطبعه مع \س صريحة. ثم يضع pending = false / معلق = خطأ، فينهي الاختبار التالي الحلقة. يقرأ فرع الفشل else / وإلا وحده parsed::error::code / محلل::الخطأ::الرمز. يطبع الرمز المستقر وسطره الجديد، ويترك معلق صحيحة لقراءة رد آخر.
لا تقرأ قيمة عند الفشل أو الخطأ عند النجاح. تؤدي قراءة أي قيمة من الفرع الخطأ في المتصفح إلى مصيدة wrong-result-branch تنهي التنفيذ. يعرض مثال الفرع الخاطئ المصيدة نفسها على لبات 0.7.0 الأصلي وينهي الأداة بالحالة 5، دون حالة دخول طبيعية. هذا ليس فشل تحليل عولج. يتجنب القالب الوصول الخطأ باختبار نجاح أولا. فشل التحليل نتيجة قابلة للاسترداد؛ لا ينتج تشخيصا وقت التشغيل ويسمح بإعادة المحاولة. تظل القراءة عند EOF تسبب مصيدة input-exhausted، ويظل الإيقاف يلغي التنفيذ. لا يتحول أي منهما إلى فشل تحليل.
ترجع دالة الدخول المحجوزة start_main() -> i64 / ابدأ_الرئيسية() -> ص64 القيمة 0 بعد الحلقة. حالة العملية الطبيعية منفصلة عن الجواب ورمز الخطأ المطبوعين.
توقع ردين
قبل التشغيل توقع خرج 12x ثم 41. بعد الرد الأول يكون الخرج Number: invalid-number\nNumber: وينتظر التنفيذ من جديد. يجعل الحرف السلسلة الأولى كلها غير صالحة؛ لا يقبل المحلل بداية عددية ويهمل الباقي. يوفر الرد الثاني العدد الصحيح 41، فيصبح الخرج بالضبط Number: invalid-number\nNumber: 42\n وحالة العملية 0. تقرأ الدورة الثانية وحدها القيمة العددية. لا تحدث قراءة ثالثة.
ما النص العددي المقبول؟
استخدم إشارة ASCII اختيارية + أو - تتبعها خانة عشرية واحدة أو أكثر من ASCII، من 0 إلى 9. تقبل الأصفار البادئة. يجب أن تقع القيمة في مجال ص64 من -9223372036854775808 إلى 9223372036854775807، شاملا الحدين.
| النص المرسل | نتيجة التحليل |
|---|---|
41 و+41 و041 و-1 |
نجاح بالقيم 41 و41 و41 و-1 |
| سطر فارغ | invalid-number |
41 أو 41 أو سطر من المسافات فقط |
invalid-number |
12x و1.5 و0x29 و+ و- |
invalid-number |
الأرقام العربية الهندية ١٢ أو العربية الهندية الممتدة ۱۲ |
invalid-number |
9223372036854775808 أو -9223372036854775809 |
number-out-of-range |
لا يحذف المحلل المسافات ولا يحول الأرقام إلى صيغة أخرى. نص الأعداد وقت التشغيل منفصل عن كتابة المصدر وعن تحويل أرقام محرر المصدر خارج النصوص والتعليقات. احفظ النص المرسل دون تغيير في هذا الدرس. لا يترجم تغيير لغة القراءة أو مفردات المصدر الإدخال أو مسودة موجودة.
للتحليل والحساب فحوص حدود منفصلة. ينجح تحليل حدي ص64، لكن إضافة 1 إلى الحد الأعلى تسبب مصيدة integer-overflow. استخدم المدخلات الصغيرة للتدرب على برنامج إعادة المحاولة. راجع النص العددي لقواعد التحويل الكاملة.
أضف اثنين بدلا من واحد
غير الجمع في فرع النجاح فقط من + 1 إلى + 2. أرسل 12x ثم 41. الخرج المتوقع بالضبط Number: invalid-number\nNumber: 43\n وحالة العملية 0. يظل الفشل الأول يعيد المحاولة ولا يقرأ القيمة العددية أبدا.
احتفظ بقالب إعادة المحاولة وأضف 2 إلى العدد الصحيح الناجح بدلا من 1. توقع الردين.
تلميح: غير العدد بعد + في فرع النجاح فقط. احتفظ باختبار نجاح وفرع الفشل وقيمتي العلامة.
اعرض الإجابة المشروحة
يظل الرد الأول 12x يرجع invalid-number. يطبع فرع الفشل رمز الخطأ ويترك معلق صحيحة، فتسأل الحلقة من جديد. ينجح الرد 41؛ يقرأ هذا الفرع وحده قيمة ويحسب 41 + 2 = 43. ينتج التنسيق النص 43، وتنهي نهاية السطر الصريحة السطر، وتصبح معلق خطأ. ترجع دالة الدخول الحالة 0 دون قراءة أخرى.
التنفيذ: المتصفح والمضيف الأصلي · لبات 0.7.0
- اقرأ شرح المثال في الدرس المرتبط قبل التشغيل.
أسطر الإدخال: ["12x","41"]
دالة ابدأ_الرئيسية() -> ص64 {
متغير معلق: منطقي = صواب.
طالما معلق {
اطبع("Number: ").
دع محلل: نتيجة<ص64> = حلل_ص64(اقرأ_سطر()).
إذا (محلل::نجاح) {
اطبع(نسق_ص64(محلل::قيمة + 2) + "\س").
معلق = خطأ.
} وإلا {
اطبع(محلل::الخطأ::الرمز + "\س").
}
}
أرجع 0.
}
النتائج المتوقعة
{
"browser": {
"check": "success",
"class": "success",
"output": "Number: invalid-number\nNumber: 43\n",
"processStatus": 0
},
"native": {
"check": 0,
"status": 0,
"output": "Number: invalid-number\nNumber: 43\n"
}
}تحقق من فهمك
اشرح لماذا يستطيع فرع الفشل المتابعة دون استخدام القيمة العددية. توقع نتيجة الرد الفارغ والمسافات المحيطة والأرقام غير ASCII قبل تجربتها. اشرح اختلاف النص الخارج عن المجال عن النص المخالف للقواعد. لا تحفظ درجة أو تقدما، ويبقى التنقل مفتوحا. عد إلى مسار الدروس أو اقرأ مرجع النتائج.