Boost :: spirit :: qi definiert einen Taschenrechner für Nullaries

Ich versuche, einen Parser für mathematische Ausdrücke zu schreiben, in dem benannte Variablen Nullen sindboost::spirit (version 1_51_0), für die ich völlig neu bin. Ich definieretypedef boost::function<double()> Value und meine Regeln werden so erklärt:qi::rule<Iterator, Value()> expression, term, others, ...;

Mit diesem Makro definiere ich binäre Operatoren für Nullarys

#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_;                                         \
}; 

und habenADD, SUBusw. Aus den Beispielen, die ich gesehen habe, würde ich erwarten, dass die Regeln folgendermaßen definiert werden:

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

aber das scheint nicht die richtige Syntax zu sein, da ich einen Fehler erhalte

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()()

das sieht für mich so aus_1 ist nicht ganz so, wie ich es erwartet habe, nämlich dieValue mit dem nächsten Begriff verbunden. Was ist die richtige Syntax, um eine Regel wie diese zu definieren?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage