سؤال

وضعي: أنا جديدة على الروح، لا بد لي من استخدام VC6 وأنا بالتالي استخدام الروح 1.6.4

.

ولدي السطر الذي يبدو مثل هذا:

//The Description;DESCRIPTION;;

وأريد أن وضع DESCRIPTION النص في السلسلة إذا يبدأ الخط مع //The Description;.

ولدي شيء أن يعمل ولكن لا يبدو أن أنيقة لي:

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+~ch_p(';'))[assign(vDescription)]
    ),
    // End grammar
    space_p).hit)
{
    const string desc(vDescription.begin(), vDescription.end());
}

وأود أن أكثر من ذلك بكثير ترغب في تعيين كافة الأحرف القابلة للطباعة ما يصل إلى ';' المقبل ولكن ما يلي لا تعمل بسبب parse(...).hit == false

parse(chars,
        // Begin grammar
        (
           as_lower_d["//the description;"]
        >> (+print_p)[assign(vDescription)]
        >> ';'
        ),
        // End grammar
        space_p).hit)

وكيف يمكنني جعله ضرب؟

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

المحلول

وقد حاول استخدام confix_p :

confix_p(as_lower_d["//the description;"],
         (+print_p)[assign(vDescription)],
         ch_p(';')
        )

وينبغي أن يكون معادلا للاستجابة فريد .

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

والجواب فريد يبني محلل جديدة، (print_p - ';')، والذي يطابق كل شيء print_p يفعل، باستثناء منقوطة. "تطابق كل شيء ما عدا <م> X ، ومن ثم تطابق <م> X " هو النمط الشائع، بحيث يتم توفير confix_p كاختصار لبناء هذا النوع من محلل. وتشير وثائق استخدامه لتحليل C- أو على غرار باسكال تعليقات، ولكن هذا غير مطلوب.

لالتعليمات البرمجية للعمل، سوف تحتاج الروح الاعتراف بأن print_p الجشع يقابل كثيرا ثم <م> التراجع للسماح مطابقة أقل. ولكن على الرغم من الروح والتراجع، وانها لن تتراجع إلى "الوسط" ما محلل الفرعي لولاها تتطابق بشراهة. وسوف تتراجع إلى القادمة "نقطة الاختيار"، ولكن قواعد اللغة الخاصة بك ليس لديها أي. انظر <م> التراجع شاملة والجشع RD في وثائق الروح.

نصائح أخرى

وأنت لا تحصل على ضربة بسبب '؛' يقابله print_p. جرب هذا:

parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+(print_p-';'))[assign(vDescription)]
    >> ';'
    ),
    // End grammar
    space_p).hit)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top