سؤال

لنفترض أن لدي تعبير منتظم LEX مثل

[aA][0-9]{2,2}[pP][sS][nN]? { return TOKEN; }

إذا دخل المستخدم

A75PsN
A75PS

سوف تتطابق

ولكن إذا كان المستخدم يقول شيئا مثل

A75PKN

أود أن أخطاء وأقول "حرف K غير معروف، نتوقع S"

ما أقوم به الآن هو مجرد كتابة مثل

let [a-zA-Z]
num [0-9]

{let}{num}{2,2}{let}{2,3}

ثم إعادة LEXING في الأساس السلسلة في YACC حتى أتمكن من وجود شروط خطأ ذات مغزى

كيف يمكنني الحصول على هذا؟

الشيء الوحيد الذي يمكنني التفكير فيه هو استخدام المجموعات المسماة؟

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

المحلول

رائع! مخطط مثير للاهتمام.

إذا كنت ستكتشف ذلك في المحلل المعجمي، فسيطلب منك قاعدة الصيد التي تتعامل مع "أي سلسلة غير معروفة بطريقة أخرى" وتنتج رسالة خطأ.

تحديد أنه كان K الذي تسبب في المشكلة ستكون الجحيم.

[^aA][0-9]{2,2}[pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[^pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][^sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][sS][^nN]  { report_error(); return ERROR; }

لاحظ وضع القفيحات، وغياب علامة الاستفهام! التعامل مع غير أرقام، أو العديد من الأرقام، أو عدد قليل جدا من الأرقام - أورغ!

بشكل عام، سيكون من الأفضل التعرف على جميع "المعرفات" ثم التحقق من صحة أي منها موافق:

[a-zA-Z][0-9]{2,2}[a-zA-Z]{2,5} { return validate_id_string(); }

اختر السم الخاص بك ما تسمح به في روتين التحقق من الصحة؛ يقرر ما إذا كان ما تم إدخاله كان على ما يرام أم لا، وقيمة عودة الضوابط التي تحكم فيها قاعدة LEX التي تعود إلى القواعد. هذه طريقة واحدة في التمييز بين الكلمات الرئيسية من المعرفات أيضا.

تعميم وتعميم التعبير المنتظم لتناسب ما يذهب حقا.

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