كيف يمكنني تحليل هذا صحيح مع روح؟
-
19-08-2019 - |
سؤال
وضعي: أنا جديدة على الروح، لا بد لي من استخدام 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)