سؤال

أنا أستخدم Flex and Bison لمولد المحلل المحلل، ولكن تواجه مشاكل مع الدول البداية في الماسح الضوئي الخاص بي.

أنا أستخدم قواعد حصرية للتعامل مع التعليق، ولكن يبدو أن هذه القواعد لا تتطابق مع الرموز المعروضة:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

في هذا المثال البسيط الخط:

// a == b

لا يتطابق بالكامل كتعليق، ما لم أدرج هذه القاعدة:

<COMMENT>"=="             ;

كيف يمكنني الحصول على هذا دون الحاجة إلى إضافة كل هذه الرموز في قواعدي الحصرية؟

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

المحلول

مطابقة تعليقات نمط C في Lex / Flex أو أي شيء موثق جيدا:

في الوثائق, ، وكذلك الاختلافات المختلفة حول الإنترنت.

فيما يلي اختلاف على ذلك الموجود في الوثائق المرن:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }

نصائح أخرى

حاول إضافة "+" بعد القاعدة [^ n]. لا أعرف لماذا لا تزال الحالة الحصرية تلتقط "==" حتى في حالة حصرية، ولكن يبدو أنها كذلك. سوف تتطابق المرن عادة القاعدة التي تتطابق مع معظم النص، وإضافة "+" سوف تجعل القواعد على الأقل على الأقل. وضع قاعدة التعليق سيؤدي أولا إلى استخدامه في حالة التعادل.

الخلاصه هى:

المشكلة هي أن قاعدة "الأكل" هذه لا تبدو تطابق الرموز مع أكثر من حرف واحد

لذلك أضف أ * لتتناسب مع صفر أو أكثر من غير مؤتمر الأولي. تريد صفر خلاف ذلك لن يتطابق تعليق فارغ.

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

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