I am trying to parse an expression which can also contain identifiers and push each element into an std::vector <std::string>, and I have come up with the following grammar:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <vector>
namespace qi = boost::spirit::qi;
struct Tokeniser
: boost::spirit::qi::grammar <std::string::const_iterator, std::vector <std::string> (), boost::spirit::ascii::space_type>
{
Tokeniser() : Tokeniser::base_type(expression)
{
namespace qi = boost::spirit::qi;
expression =
term >>
*( (qi::string("+")[qi::_val.push_back(qi::_1)] >> term) |
(qi::string("-")[qi::_val.push_back(qi::_1)] >> term) );
term =
factor >>
*( (qi::string("*")[qi::_val.push_back(qi::_1)] >> factor) |
(qi::string("/")[qi::_val.push_back(qi::_1)] >> factor) );
factor =
(identifier | myDouble_)[qi::_val.push_back(qi::_1)] |
qi::string("(")[qi::_val.push_back(qi::_1)] >> expression >> qi::string(")")[qi::_val.push_back(qi::_1)];
identifier = qi::raw [ qi::lexeme[ (qi::alpha | '_') >> *(qi::alnum | '_') ] ];
myDouble_ = qi::raw [ qi::double_ ];
}
boost::spirit::qi::rule<std::string::const_iterator, std::vector <std::string> (), boost::spirit::ascii::space_type> expression;
boost::spirit::qi::rule<std::string::const_iterator, boost::spirit::ascii::space_type> factor;
boost::spirit::qi::rule<std::string::const_iterator, boost::spirit::ascii::space_type> term;
boost::spirit::qi::rule<std::string::const_iterator, std::string(), boost::spirit::ascii::space_type> identifier;
boost::spirit::qi::rule<std::string::const_iterator, std::string(), boost::spirit::ascii::space_type> myDouble_;
};
However, I get the following error 'const struct boost::phoenix::actor<boost::spirit::attribute<0> >' has no member named 'push_back'.
Is there a direct way to perform what I am trying to do?