5

Boost-1.42.0 と VS2005 で配布された Boost.Spirit を使用しています。私の問題はこのようなものです。

コンマで区切られたこの文字列があります。最初の 3 つのフィールドは文字列で、残りは数値です。このような。

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))

My parse function parses the line and returns true and after

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

I'm expecting var.stringVector and var.doubleVector are properly filled. but it is not the case.

What is going wrong ?

The code sample is located here

Thanks in advance, Surya

4

1 に答える 1

6

qi::skip_typeスキッパーを使用できるものではありません。qi::skip_type は placeholder のタイプであり、ディレクティブのみqi::skipに適用され( a 内でのスキップを有効にするか、使用中のスキッパーを変更するため)、それ自体は任意の入力に一致するパーサー コンポーネントではありません。代わりに特定のスキッパータイプを指定する必要があります(あなたの場合はそれです)。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_ % ',');

これはまさにあなたが期待することをするはずです。

于 2010-03-19T13:04:30.327 に答える