
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

On 5/18/2010 8:40 AM, khaled hamidouche wrote:
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
#include #include #include #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
{ 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
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
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
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
You are probably better off sending a message to the Spirit mailing list: spirit-general@lists.sourceforge.net
participants (2)
-
khaled hamidouche
-
Raindog