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?