3

Boost 1.44 を使用しています。Spirit パーサーは数値の解析には適していますが、文字列の解析には注意が必要です。複数の区切り文字 ',' ,';' を使用して分割する文字列を解析しようとしています。また ' '。これを行うと、数値に対してうまく機能します(vect = vector < double >):

qi::parse(first,last,double_ >> *(',' >> double_  | ' ' >> double_ | ';' >> double_),

ベクトル、スペース);

ただし、vect = vector< string > を使用して文字列の文法を変更すると、

+char_ >> *(',' >> +char_  | ' ' >> +char_ | ';' >> +char_)

次のエラーが表示されます。

/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error: invalid conversion from ‘char’ to ‘const char*’/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error:   initializing argument 1 of ‘std::basic_string<_CharT, _Traits,_Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’

エラーを、文字列ではなく一連の文字として解釈される文法構文の最初の +char_ に絞り込みました。この問題を解決する方法はありますか?

ありがとう

4

1 に答える 1

7

スピリットの最近のバージョンでは、文字列の処理 (その方法) がずっと簡単になりました。属性処理コードが大幅に書き直された Boost V1.47 の Spirit を使用することをお勧めします。

しかし、あなたが望むようにコンパイルしたとしても、あなたが期待する方法で解析することはできません. スピリットは本質的に貪欲です。つまり+char_、入力に残っているものは何でも無条件に消費します。あった方が良さそうです

+~char_(", ;") % char_(", ;")

つまり、セットに含まれ+ていない ( ) 1 つまたは複数の ( ) 文字が、それらの文字の 1 つだけに挿入されています。リスト パーサー ( ) は a を公開します。ここで、 は左側の式の属性であり、上記の場合は a です。~", ;"%vector<A>Avector<string>

于 2011-09-27T11:30:09.323 に答える