سلسلة التحليل ، مع Boost Spirit 2 ، لملء البيانات في البنية المحددة للمستخدم

StackOverflow https://stackoverflow.com/questions/2469861

سؤال

أنا أستخدم Boost.Spirit الذي تم توزيعه باستخدام Boost-1.42.0 مع VS2005. مشكلتي مثل هذا.

أنا هذه السلسلة التي تم تحديدها مع الفواصل. الحقول الثلاثة الأولى منه هي سلاسل والباقي أرقام. مثله.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4

قاعدتي مثل هذا

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;

أحاول تخزين البيانات في بنية مثل هذا.

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;

لقد لفته في boost_fusion_adapt_structure لاستخدامه مع الروح.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))

تعمل وظيفتي في التحليل على الخط وتعيد صحيحًا وبعد

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

أتوقع أن يتم ملء Var.StringVector و Var.DoubleVector بشكل صحيح. ولكن ليس هذا هو الحال.

ما هو الخطأ؟

عينة الكود موجودة هنا

شكرا مقدما ، سوريا

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

المحلول

qi::skip_type ليس شيئًا يمكنك استخدامه قائد قائد. Qi :: Skip_type هو نوع العنصر النائب qi::skip, ، والذي ينطبق على skip[] التوجيه فقط (لتمكين التخطي داخل أ lexeme[] أو لتغيير سكيبر قيد الاستخدام) والذي ليس مكونًا محللًا يطابق أي مدخلات من تلقاء نفسه. تحتاج إلى تحديد نوع القائد المحدد بدلاً من ذلك (في حالتك boost::spirit::ascii:space_type).

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

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');

الذي يجب أن يفعل بالضبط ما تتوقعه.

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