ドキュメントには、AとBの両方を使用する場合、2つの複合ルール(a >> b)の属性はタプルである必要があると記載されています。
これを想定して、そのようなタプルの最初の属性を読み取ろうとしました。しかし、失敗します:(
解析された整数を'i'に格納しようとします)
#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_object.hpp>
template <typename ForwardIterator> class TestGrammar
: public boost::spirit::qi::grammar<ForwardIterator, boost::spirit::ascii::space_type>
{
boost::spirit::qi::rule<ForwardIterator, boost::spirit::ascii::space_type> foo_;
public:
TestGrammar( void ) : TestGrammar::base_type( foo_ )
{
int i;
foo_ = ((boost::spirit::qi::int_ >> boost::spirit::qi::float_)
[boost::phoenix::ref(i) = boost::phoenix::at_c<0>(boost::spirit::_1)]);
}
};
int main( void )
{
TestGrammar<std::string::iterator> g;
return 0;
}
書き込み:
foo_ = ((boost::spirit::qi::int_ >> boost::spirit::qi::float_)
[boost::phoenix::ref(i) = boost::spirit::_1]);
Aがintである限り、常に機能します。
タイプを前後に変更し、カスタムルールを作成すると、(a >> b)の属性はBが何であるかに関係なく常にAになることが明らかになりました。
平