سؤال

وأنا أكتب lexer jFlex للوا، وأواجه مشاكل تصميم تعبير عادي لتتناسب مع جزء معين من مواصفات لغة:

<اقتباس فقرة>   يمكن أيضا تعريف

والسلاسل الحرفية باستخدام تنسيق طويلة محاطة الأقواس الطويلة. نحدد على قوس طويل من مستوى ن ك قوس مربع افتتاح تتبعه علامات ن المساواة تليها قوس مربع فتح آخر. لذلك، وهو قوس طويل من مستوى 0 كما هو مكتوب [[، هو مكتوب على قوس طويل من مستوى (1)، [= [، وهلم جرا. يتم تعريف قوس طويل إغلاق بالمثل. على سبيل المثال، يتم كتابة على إغلاق قوس طويل من مستوى 4 كما] ====]. تبدأ سلسلة طويلة مع قوس طويل من أي مستوى وتنتهي في أول قوس إغلاق طويل من نفس المستوى. حرفية في هذا النموذج بين قوسين يمكن تشغيل عدة خطوط، لا تفسر أي أحرف، وتجاهل الأقواس الطويلة من أي مستوى آخر. يمكن أن تحتوي على أي شيء ما عدا قوس إغلاق المستوى المناسب.

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

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

المحلول

\[(=*)\[.*?\]\1\]

وعلى \ 1 يلتقط أول ().

نصائح أخرى

حسنا، أنا خائف tokenizing مع التعابير العادية ليست جيدة بما فيه الكفاية للقيام بهذه المهمة. التعابير العادية ليست فقط قوية بما فيه الكفاية.

وليس هناك وسيلة لمقارنة عدد من علامات '=' باستخدام عبارات عادية عادي في jFlex. سوف بيرل يكون الإختراق لذلك (\ 1 على النحو المقترح أعلاه)، ولكن نحن لا نتحدث عن البرمجة بيرل، ولكن jFlex lexer.

والحل هو أن يذهب مع \ [= * \ [لرمز قوس الأيسر، \] = * \] لرمز قوس الأيسر ثم في طبقة فوق (محلل) مقارنة إذا كانت تطابق في الطول.

وعلى أي حال، يمكنك أن تبحث في read_long_string () في التعليمات البرمجية المصدر لوا في llex.c ونرى كيف فعلوا ذلك دون استخدام تعبيرات عادية على الإطلاق.

\[(=*)\[.*?\]\1\]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top