Hello with Joel Falcou we are wondring to write a parser to parse mathematical expression like (N1*3+N2/N3) ... with N1, N2, N3 are variables where their value are in an std vector so I take the calc example and I change it. my code looks like this #include <boost/config/warning_disable.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/spirit/home/phoenix/container.hpp> #include <iostream> #include <string> #include <vector> namespace client { namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; void do_add() { std::cout << "add\n"; } /////////////////////////////////////////////////////////////////////////// // Our calculator grammar /////////////////////////////////////////////////////////////////////////// template <typename Iterator> struct calculator : qi::grammar<Iterator, int(), ascii::space_type> { calculator(std::vector<int> const & vec) : calculator::base_type(expression), vect(vec) { using qi::_val; using qi::_1; using qi::uint_; using ascii::char_; int index; // vect.resize(3); // // // vect[0]=10; // vect[1]=11; // vect[2]=12; //vect=vec; expression = term [_val = _1] >> *( ('+' >> term [_val += _1]) | ('-' >> term [_val -= _1]) ) ; term = factor [_val = _1] >> *( ('*' >> factor [_val *= _1]) | ('/' >> factor [_val /= _1]) ) ; factor = uint_ [_val = _1] | char_ >>uint_ [_val = at(vect,_1)] | '(' >> expression [_val = _1] >> ')' | ('-' >> factor [_val = -_1]) | ('+' >> factor [_val = _1]) ; } qi::rule<Iterator, int(), ascii::space_type> expression, term, factor; std::vector<int> vect; }; } /////////////////////////////////////////////////////////////////////////////// // Main program /////////////////////////////////////////////////////////////////////////////// int main() { std::cout << "/////////////////////////////////////////////////////////\n\n"; std::cout << "Expression parser...\n\n"; std::cout << "/////////////////////////////////////////////////////////\n\n"; std::cout << "Type an expression...or [q or Q] to quit\n\n"; using boost::spirit::ascii::space; typedef std::string::const_iterator iterator_type; typedef client::calculator<iterator_type> calculator; std::vector<int> vec(3); vec[0]=10; vec[1]=11; vec[2]=12; calculator calc(vec); // Our grammar std::string str; int result; while (std::getline(std::cin, str)) { if (str.empty() || str[0] == 'q' || str[0] == 'Q') break; std::string::const_iterator iter = str.begin(); std::string::const_iterator end = str.end(); bool r = phrase_parse(iter, end, calc, space, result); if (r && iter == end) { std::cout << "-------------------------\n"; std::cout << "Parsing succeeded\n"; std::cout << "result = " << result << std::endl; std::cout << "-------------------------\n"; } else { std::string rest(iter, end); std::cout << "-------------------------\n"; std::cout << "Parsing failed\n"; std::cout << "stopped at: \": " << rest << "\"\n"; std::cout << "-------------------------\n"; } } std::cout << "Bye... :-) \n\n"; return 0; } when I compile I get this error /home/hamidou/LLVM/parser /main.cpp:296: instantiated from here /usr/local/include/boost-1_42/boost/spirit/home/phoenix/core/detail/function_eval.hpp:135: error: invalid initialization of reference of type ‘int&’ from expression of type ‘const int’ Process terminated with status 1 (0 minutes, 11 seconds) 1 errors, 1 warnings when I remove the use of the vector vect inside my grammar it works fine !! So, please what I did wrong ?? Thank you so much for helping me