سؤال

ما هي أفضل طريقة للتعامل مع العديد من موزعي فليكس / البيسون داخل المشروع؟

وكتبت محلل والآن أحتاج إلى ثانية واحدة في نفس المشروع. وحتى الآن في القسم الثالث من parser1.y I إدخال طريقة main(..) ودعا yyparse من هناك.

وماذا أريد الحصول على وجود اثنين من موزعي مختلفة (parser1.y وparser2.y) وتكون قادرة على استخدامها من وظيفة الخارجية (دعونا نفترض main في main.cpp).

ما الاحتياطات التي يجب استخدامها لتصدير وظائف yyparse خارج ملفات .y وكيف يجب أن أتعامل مع اثنين من موزعي؟

وPS. أنا باستخدام ز ++ لتجميع ولكن ليس الإصدارات C ++ من فليكس وبيسون وأود أن يبقيه بهذه الطريقة (وذلك لتجنب التغليف محلل داخل كائن).

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

المحلول

ملحوظة التي توفر بيسون الخيار '-p ZZ' لرموز البادئة مع 'ZZ' بدلا من 'yyyy إنهاء ".

وعلى نحو مماثل، يوفر فليكس الخيار 'ف خ خ "إلى حرف بادئة مع' ZZ 'بدلا من' yyyy إنهاء". ويستخدم "-p" للإبلاغ عن الأداء. 'تيس من المؤسف أنها لا تتفق مع بعضها البعض.

نصائح أخرى

وبالإضافة إلى الإجابة يفلر، وكنت ترغب في تقديم مقاربة أخرى هنا:

في الملف .lex هل يمكن استخدام %option prefix="PREFIX"، وفي ملف .y هل يمكن استخدام %define api.prefix PREFIX، الذي يفعل الشيء نفسه كما يمر -p PREFIX إلى البيسون و-P PREFIX إلى فليكس.

لاحظ بعد الغلابة من yy بادئة الافتراضية، يمكنك الوصول إلى الأسماء الداخلية عبر كل من yy* الأصلي وPREFIX* يتم تجاوز، في حين من الواضح للأسماء الخارجية يجب أن تستخدم PREFIX* للوصول إليها.

إذا كنت تستخدم بيسون 3.0 أو أفضل، ثم إلقاء نظرة على %define api.prefix {foo_}، الذي يحل محل كل البادئات yy وYY مع foo_ وFOO_.

وثائق حول موزعي متعددة .

وبين بيسون 2.6 و 3.0، وتستخدم أن يكون هناك أي الأقواس: %define api.prefix foo_

والمتغير api.prefix لا يعمل بالنسبة لي بعد الآن (انها تنتج خطأ الترجمة)

%define api.prefix {PREFIX}

واضطررت لاستخدام بناء الجملة التالي

%name-prefix="PREFIX"

وبالإضافة إلى ما سبق، إذا كنت تستخدم '٪ تحديد api.prefix {PREFIX} فإنه سيتم أيضا إعادة تسمية yytext && yyparse إلى PREFIXtext وPREFIXparse. لا ننسى {} حول البادئة!
الأمر نفسه ينطبق على '٪ الخيار بادئة = "PREFIX" "في الدعوى، وسيتم تغيير اسم lexer لPREFIXlex.

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