سؤال

وأود أن تكون قادرة على تحليل هيكل التالي:

blah
{
    "string-1",
    "string-2",
    ...,
    "string-n"
}

وأنا باستخدام المرن لtokenize، وهذا ما يعمل تماما. أنا باستخدام ياك (البيسون) للتحليل.

ما هي الطريقة الموصى بها للسماح لهذا الهيكل؟ الآن، في ملف test.y بلدي، لقد حصلت على:

blah_command:
    BLAH OPEN_BRACE string_list CLOSE_BRACE
    {
        printf( "String list is %s\n", $3 );
    }

string_list: /* empty */
    |
    STRING
    {
        return $1;
    }
    |
    STRING COMMA string_list
    {
        strcat($1, ",");
        strcat($1, $3);
    }

وأظن أن strcat () هو فكرة سيئة حقا. أنا مبتدئ الحقيقي عندما يتعلق الأمر ليكس / ياك (حوالي 3 ساعات الخبرة) لذلك صفعة على المعصم والمؤشر في الاتجاه الصحيح سيكون أمرا رائعا.

وتحرير: والهدف من ذلك هو السماح لي لبناء تسخير اختبار لتطبيق خارجي. سيتم استخدام lexing / تحليل لتفسير النصي الاختبار الذي يوفر للمستخدم. أمر واحد يتيح للمستخدم إرسال رسالة إلى التطبيق، ثم قرأت ردا متعدد الخطوط ومقارنتها مع قائمة طول متغير سلاسل قدمت المستخدم في البرنامج النصي. جزء لقد نشرت أعلاه هو الطريق كنت احسب أن تسمح للمستخدم تحديد الاستجابة الممكنة.

وعلى سبيل المثال:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

أو

blah
{
    "QUERY COMPLETE IN .0034 SECONDS",
    "1 RECORD FOUND:",
    "FOO=12345",
    "--END OF LIST--"
}
هل كانت مفيدة؟

المحلول

إذا كل ما تقوم به هو طباعة هذه، strcat () يعمل بشكل جيد لربط جميع الخيوط معا.

وعادة، ومع ذلك، محلل الخاص بك وسوف يكون بناء شجرة جملة مجردة. وذلك بدلا من إخراج السلسلة، سيكون لديك شيء من هذا القبيل ما يلي:

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;

نصائح أخرى

في المثال الخاص بك، وأنت ببساطة إخراج المدخلات، لذلك strcat على ما يرام.

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

إذا كنت تعطي المزيد من التفاصيل عن الهدف من البرنامج، ويمكنني أن أعطيك إجابة أكثر تفصيلا.

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