2016-07-24 16 views
1

スピリットx3のさまざまな数値を文字列に解析したいと思います。私はこれのようにしようとしましたが、それは動作しません。ブーストスピリットで文字列に数値を解析するx3

typedef x3::rule<class int_parser_id, std::string> int_parser_type; 
const int_parser_type int_parser = "int_parser"; 
auto const int_parser_def = x3::int32; 

x3 :: int32パーサーでIntを文字列に解析するにはどうすればよいですか?

+2

「うまくいきません」と言っても、あなたに役立つものは何も教えてくれません。 ***どのように***それは動作しません***を記述してください。ビルドエラーが出ますか?実行時にクラッシュしますか?間違った結果?より詳細な詳細。ビルドエラーが発生した場合は、そのエラーを(完全かつ完全な)*テキストとしてコピーして、*問題の本文にコピーしてください。予期しない結果が得られたら、あなたの入力と実際の*と期待される*出力を教えてください。クラッシュが発生した場合は、デバッガを実行してクラッシュを特定します。また、[良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+0

@JoachimPileborg:この場合、私の車は泳ぐのと同じようには機能しません。ライブラリはそのためのものではありません。しかし、もしオペレータがそれを知っていたら、最初にこの疑問を聞いていないでしょう...; - ] – ildjarn

+2

このパーサーは一連の数字を文字列に解析して、 std :: string input = "1234"; std :: string out; x3 :: phrase_parse(input.begin()、input.end()、+ x3 :: digit、x3 :: space、out); アサート(out == input); (1桁以上を意味します。 '数字'パーサーの属性は 'char'なので、プラスを前に置くと、charまたはstringのベクトルが得られます)。 – matiu

答えて

1

解析は、コンクリートタイプまたはタイプのセットのオブジェクトを生成するために文字列をスキャンすることです。あなたが求めているのは、スピリットが「世代」と呼んでいることの反対です。 Spirit.X3は解析のみを実行するので、あなたの直接の質問に対する答えは:あなたはできません。

ただし、Spiritには生成のための別のコンポーネントが付属しています:Spirit.Karma

namespace karma = boost::spirit::karma; 

int const i = /*...*/; 
std::string str; 
karma::generate(std::back_inserter(str), karma::int_, i); 

Online Demo

カルマがC++ 03のコードベースであり、その結果X3よりもはるかに長いコンパイル時間を有することに留意しなければならない - プリコンパイル済みヘッダーの使用を強くお勧めします!

関連する問題