سؤال

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

كيف يمكنني حل هذا؟ حاولت صنع <<EOF>> إرجاع MY_EOF لكن عندما أفعل ذلك ، تعطل ليكس موتًا مروعًا. أعتقد أن هناك رمزًا في EOF الافتراضي الذي لا أتصل به. ليس لدي أي فكرة عن الوظائف التي قد تكون عليها. باستخدام EOF إنشاء الخطأ symbol EOF is used, but is not defined as a token and has no rules

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

المحلول

يمكنك استخدام قاعدة Flex EOF لإلحاق خط جديد بالمدخلات:

<<EOF>> { static int once = 0; return once++ ? 0 : '\n' }

نصائح أخرى

في ملف LEX الخاص بك

#define yyterminate() return token::END

في ملف YACC الخاص بك

%token END 0 "end of file"

في الواقع لالتقاط نهاية الملف في lex | flex يمكنك استخدام yywrap() الوظيفة التي يسمى المحلل المعجمي إذا تم الوصول إلى نهاية ملف الإدخال.

هذا الحل متاح من قبل كل من LEX و Flex.The رد الاتصال yywrap() يشير إلى EOFحتى تتمكن من إعادة تنفيذ هذه الوظيفة وحقن العمل الذي تحتاج إلى القيام به في نهاية دفق الإدخال الخاص بك.

السابق يعمل بشكل جيد بالنسبة لي.

إذا كنت تستخدم C Bizon (وليس C ++) ، فما عليك سوى استخدام End for Token :: End و yacc %token END

كان لديه مشكلة أخرى بعد ذلك ، إذا لم ترد وحدات الماكرو yy_null ، فإنها لا تنتهي أبدًا (حلقة لا نهائية)

يمكن حلها مثل هذا:

bool term = false;
#define yyterminate() return (term = !term)?END : YY_NULL
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top