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
, SUB
usw. 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?