سؤال

أحاول صنع محلل Bison لمعالجة أحرف UTF-8. لا أريد أن يفسر المحلل المحلل قيم حرف Unicode فعليا، لكنني أريدها تحليل سلسلة UTF-8 كسلسلة من البايتات.

الآن، يولد Bison التعليمات البرمجية التالية التي هي مشكلة:

  if (yychar <= YYEOF)
    {
      yychar = yytoken = YYEOF;
      YYDPRINTF ((stderr, "Now at end of input.\n"));
    }

المشكلة هي أن العديد من بايت سلسلة UTF-8 سيكون لها قيمة سلبية، وتفسر Bison القيم السلبية كإرسال EOF، وتوقف.

هل هناك طريقة للتغلب على ذلك؟

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

المحلول

bison نعم، flex رقم. في المرة الأولى التي كنت بحاجة إلى محلل Beison للعمل مع ملفات Outf-8 المشفرة التي انتهيت منها كتابة بلدي yylex وظيفة.

تعديل: للمساعدة، استخدمت الكثير من عمليات يونيكود المتاحة في غليظ (هناك gunicode اكتب وبعض وظائف معالجة الملفات / السلسلة التي وجدت مفيدة).

نصائح أخرى

flex كونها القضية هنا، قد ترغب في إلقاء نظرة على zlex.

هذا سؤال منذ 4 سنوات، لكنني مواجه نفس القضايا وأود أن أشارك أفكاري.

المشكلة هي أنه في UTF-8 أنت لا تعرف عدد بايت القراءة. كما هو مقترح أعلاه، يمكنك استخدام Lexer الخاص بك، ولديها إما قراءة الخطوط كاملة، أو هل قرأت 4 بايت في كل مرة. ثم استخراج حرف UTF-8 من ذلك، وقراءة المزيد بايت لإكمال مرة أخرى إلى 4 بايت.

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