动态创建和写入向量

时间:2014-09-15 13:19:38

标签: c++ boost-spirit-qi

我想在一个精神规则中创建向量并为其添加值(如果有的话)。可能吗?我尝试了类似下面的东西,但没有成功。请阅读代码注释以获取详细信息感谢。

typedef std::vector<double> number_array;
typedef std::vector<std::string> string_array;

typedef boost::variant<number_array, string_array> node 

template<typename Iterator>
struct parser 
      : qi::grammar<Iterator, node(), ascii::space_type> {

    parser(parser_impl* p) 
            : parser::base_type(expr_, ""), 
              error_handler(ErrorHandler(p)) {

        // Here I want to create vector on the fly 
        // and append values to newly created vector.
        // but this doesn't compile, specifically phoenix::push_back(...)
        number_array_ = qi::lit('n[')[qi::_val = construct<number_array>()] >> 
                       -(qi::double_ % ',')[phoenix::push_back(phoenix::ref(qi::_val), qi::_1)] >> ']';

        // this doesn't compile too
        string_array_ = qi::lit('s[')[qi::_val = construct<string_array>()] >> 
                       -(quoted_string % ',')[phoenix::push_back(phoenix::ref(qi::_val), qi::_1)] >> ']';                       

        quoted_string %= "'" > qi::lexeme[*(qi::char_ - "'")] > "'";

        expr_ = number_array_[qi::_val =  qi::_1] | string_array_[[qi::_val =  qi::_1]];
    }
    qi::rule<Iterator, number_array(), ascii::space_type> number_array_;
    qi::rule<Iterator, string_array(), ascii::space_type> string_array_;
    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
    qi::rule<Iterator, node(), ascii::space_type> expr_;    
};

1 个答案:

答案 0 :(得分:2)

最重要的是,我认为你可以在没有所有语义行为的情况下做到这一点。

他们只执行默认属性规则已经执行的操作(标量属性为_val = _1,基本上为变量属性为insert(_val, end(_val), _1)

这意味着您可以将整个shebang写为

    number_array_ = "n[" >> -(qi::double_ % ',')   >> ']';
    string_array_ = "s[" >> -(quoted_string % ',') >> ']';

    quoted_string = "'" > qi::lexeme[*(qi::char_ - "'")] > "'";

    expr_         = number_array_ | string_array_;

这将有效。请注意,我修复了多字节文字'n[''s[n'

另见Boost Spirit: "Semantic actions are evil"?