Obvoiusly, it's because you messed up the order of members of 'calculation' struct and how the attributes are propogated to it. Let's take a look:
BOOST_FUSION_ADAPT_STRUCT(
calculation, (int, a) (int, b) (char, op) )
// operandA, operandB, operator
crule %= (int_ >>
(char_('+')|char_('-')|char_('*')|char_('/')) >>
int_);
// operandA, operator, operandB
Noticed the order?
So just change it into:
BOOST_FUSION_ADAPT_STRUCT(calculation, (int, a)(char, op)(int, b))
then it'll work as expected.
BTW, you used "cin >> str;" to get the line, it can extract the string before any space, you may want to use "getline(cin, str)" here.