documentation表示,如果同时使用A和B,则两个复合规则(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是一个整数,它将始终有效。
来回更改类型并编写自定义规则表明,无论B是什么,(a >> b)的属性将始终为A。
甚至
最佳答案
我想您想这样做:
int i;
float f;
foo_ = (boost::spirit::qi::int_ >> boost::spirit::qi::float_)
[ boost::phoenix::ref(i) = boost::spirit::_1,
boost::phoenix::ref(f) = boost::spirit::_2 ];
如果您真的想使用该序列,请尝试:
foo_ = qi::attr_cast<>(qi::int_ >> qi::float_)
[ boost::phoenix::ref(i) = phx::at_c<0>(qi::_1),
boost::phoenix::ref(f) = phx::at_c<1>(qi::_1) ]
或使用辅助规则:
helper = qi::int_ >> qi::float_;
foo_ = helper
[ boost::phoenix::ref(i) = phx::at_c<0>(qi::_1),
boost::phoenix::ref(f) = phx::at_c<1>(qi::_1) ]
;
所有这三个版本均在上编译http://liveworkspace.org/code/518f2bd03e1fed7ed734d62071a88eab
关于c++ - 属性合成在Boost::spirit中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12238562/