/ / boost :: spirit:セマンティックアクションブロックの複数のステートメント-c ++、boost、boost-spirit-qi、boost-phoenix

boost :: spirit:セマンティックアクションブロックの複数のステートメント - c ++、boost、boost-spirit-qi、boost-phoenix

boost :: phoenixは、演算子 "、"を使用してステートメントブロックを定義します(参照 フェニックスブロックステートメントのブースト)。 boost :: spiritルールのセマンティックアクション部分でこの構造を使用しようとしています。ただし、ステートメントブロックの最後のステートメントのみが実行されるように見えます。問題を示す最小限のコンパイル可能な例を次に示します。

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

int main()
{
using boost::spirit::qi::int_;
using boost::phoenix::ref;
using boost::spirit::qi::phrase_parse;
using boost::spirit::ascii::space;

int a = 0;
int b = 0;

const std::string s("1");
bool f = phrase_parse(s.begin(),s.end(),
int_[
ref(a)=1,
ref(b)=2
],
space);
std::cout << f << ": a=" << a << ", b=" << b << std::endl;
}

このプログラム(ブースト1.52を使用)は印刷します

1:a = 0、b = 2

しかし、私はa = 1、b = 2を期待していました。これはどのように機能するはずですか?どうして?

ありがとう!

回答:

回答№1は4

コンパイル時間がそうなることは決してないという事実に照らして クイック スピリットを使用して、ユーティリティライブラリの「ハイレベルインクルード」に固執することをお勧めします。

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

int main()
{
namespace qi = boost::spirit::qi;

int a = 0, b = 0;

const std::string s("1");
bool f = qi::phrase_parse(s.begin(),s.end(),
qi::int_[
boost::phoenix::ref(a)=1,
boost::phoenix::ref(b)=2
],
qi::space);
std::cout << f << ": a=" << a << ", b=" << b << std::endl;
}

同様に、私は通常お勧めします boost/fusion/adapted.hpp 以上 boost/fusion/adapted/struct.hpp e.a.、または boost/range/algorithm.hpp.

マイレージは異なる場合がありますが、スピリットパーサーを定義するTUは通常、私のプロジェクトのコンパイル時間を最適化するポイントではありません。