سلسلة التحليل ، مع Boost Spirit 2 ، لملء البيانات في البنية المحددة للمستخدم
-
20-09-2019 - |
سؤال
أنا أستخدم 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_ % ',');
الذي يجب أن يفعل بالضبط ما تتوقعه.