سؤال

أريد أن أقبل عدد عشري بين 0 و 255. هذا هو أفضل ما يمكنني التوصل إليه مع:

جزء my_token: ('0' .. '9') | // 0 -> 9 ('1' .. '9' '0' .. '9') | // 0 -> 99 ('1' '0' .. '9' '0' .. '9') | // 100 -> 199 ('2' '0' .. '4' '0' .. '9') | // 200 -> 249 ('25' '0' .. '5')؛ // 250 -> 255

لكنني مجرد n00b جاهل. surelry هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

سيكون لديك نتائج أفضل بكثير إذا كنت ترخي Lexer وتأجيل التحقق إلى وقت لاحق. ليكس NUMBER, ، ثم عند تحويله لاحقا، يمكنك تقديم رسالة خطأ محددة للغاية إذا كانت القيمة خارج النطاق. إذا قمت بإنشاء Lexer صارم وشخص ما يدخل 256، فإن رسالة الخطأ التي النتائج غير مقروءة لأي شخص لم يصدر قويما من قبل.

NUMBER
    :    '0'..'9'+
    ;

نصائح أخرى

لقد قمت بالإجابة 280Z28 - افعل ما اقترحه هناك. ولكن إذا كنت تريد وسيلة أخرى لكتابة النمط، فيمكنك تجربة:

0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?

لقد عرضت أكثر من أي شيء آخر. من الصعب التحقق (في المرة الأولى التي كتبت فيها، لقد ارتكبت خطأ لم يتم القبض عليه حتى اختبره)، وليس شيئا يجب عليك استخدامه في التعليمات البرمجية الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top