I've recently switched from YACC to Spirit
and I've been trying to rewrite some examples
from YACC manual, starting with a RPN calculator.
Based on http://www.boost.org/libs/spirit/doc/grammar.html
I made something like this:
/* #includes and usings */
struct rpn_calc : public grammar
{
template <typename ScannerT>
struct definition
{
definition (rpn_calc const& self)
{
expr_add = expr >> ch_p(' ') >>
expr >> ch_p(' ') >> ch_p('+');
expr_sub = expr >> ch_p(' ') >>
expr >> ch_p(' ') >> ch_p('-');
expr_mul = expr >> ch_p(' ') >>
expr >> ch_p(' ') >> ch_p('*');
expr_div = expr >> ch_p(' ') >>
expr >> ch_p(' ') >> ch_p('/');
expr_pow = expr >> ch_p(' ') >>
expr >> ch_p(' ') >> ch_p('^');
expr = expr_add | expr_sub |
expr_mul | expr_div |
expr_pow | real_p;
}
rule<ScannerT> expr, expr_add,
expr_sub, expr_mul,
expr_div, expr_pow;
rule<ScannerT> const&
start () const { return expr; }
};
};
int main (void)
{
rpn_calc calc;
std::string str("1 2 + 3 4 + *");
if (parse(str.begin(), str.end(), calc, space_p).full)
cout << "Parsing succeeded.\n";
else
cout << "Parsing failed!\n";
return 0;
}
Now this compiles OK, but when executed it doesn't
output anything, which means that parse(...) quits
without any warnings - what's the problem?
Am I doing something wrong?
Thanks,
Misza