Boost :: spirit :: qi definiujący kalkulator dla sędziów

Próbuję napisać parser dla wyrażeń matematycznych, w których zmienne nazwane są wartościami zerowymiboost::spirit (wersja 1_51_0), do której jestem całkowicie nowy. Ja definiujętypedef boost::function<double()> Value a moje zasady zostaną ogłoszone w ten sposób:qi::rule<Iterator, Value()> expression, term, others, ...;

Za pomocą tego makra definiuję operatory binarne na wartościach pustych

#define BINARY_FUNCTOR(name, op)                        \
struct name                                             \
{                                                       \
  name(Value x, Value y): x_(x), y_(y) {}               \
  double operator()() { return x_() op y_(); }          \
  Value x_, y_;                                         \
}; 

i mająADD, SUB, itp. Z przykładów, które widziałem, spodziewałbym się, że reguły zostaną zdefiniowane w ten sposób:

expression = term
             >> *( (lit('+') >> term[ADD(_val, _1)])
                 | (lit('-') >> term[SUB(_val, _1)])
                 );

ale to nie wydaje się być właściwą składnią, ponieważ pojawia się błąd

boost/spirit/home/support/action_dispatch.hpp:162: error: no match for call to ‘(const<unnamed>::SUB) (boost::function<double ()()>&, boost::spirit::context<boost::fusion::cons<boost::function<double ()()>&, boost::fusion::nil>, boost::fusion::vector0<void> >&, bool&)’
SRParser.cpp:38: note: candidates are: double<unnamed>::SUB::operator()()

co mi się wydaje_1 nie do końca tak się spodziewam, a mianowicieValue związane z następnym semestrem. Jaka jest właściwa składnia do zdefiniowania takiej reguły?

questionAnswers(1)

yourAnswerToTheQuestion