我正在嘗試編寫一個數學表達式的解析器,其中命名變量爲boost::spirit
(版本1_51_0)中的nullaries,我完全是新的。我定義typedef boost::function<double()> Value
和我的規則將被宣佈像這樣:qi::rule<Iterator, Value()> expression, term, others, ...;
Boost :: spirit :: qi爲nullaries定義計算器
我定義上nullaries二元算這個宏
#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_; \
};
,並有ADD
,SUB
等從我所看到的例子,我倒是想到的規則是這樣定義:
expression = term
>> *((lit('+') >> term[ADD(_val, _1)])
| (lit('-') >> term[SUB(_val, _1)])
);
,但似乎並沒有被正確的語法,因爲我得到一個錯誤
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()()
看起來像我一樣_1
是不是我所期望的那樣,即與下一期有關的Value
。什麼是正確的語法來定義這樣的規則?
這不是語法這裏,儘可能多因爲它是關於語義的。其實,語義動作。請參閱http://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/action.html獲取有關''''和''''之間所期望的內容的文檔。看到我的答案工作演示:) – sehe 2013-03-18 23:29:57