我想評估布爾表達式,例如a = b & s < 9或者僅僅使用比較運算符(不包括邏輯運算符,如| &和!)。我們可以有以下AST:助推精神如何從父節點訪問子節點(葉)
=
/\
/ \
a b
或
&
/\
/ \
= <
/\ /\
/ \/\
a b s 9
葉子節點的值。離開節點的父節點始終是比較運算符,如=,!=,<,>,> =,< =。比較節點的父節點是邏輯運算符|,&和!。我想從父節點訪問值節點(葉),然後將這些值傳遞給另一個函數(稍後將實現)。解析步驟是可以的。
如何從父節點訪問值節點(樹葉)。 我使用的例子在: How to calculate boolean expression in Spirit
和 Boolean expression (grammar) parser in c++ 這是從這些環節所採取的評估代碼:
struct eval : boost::static_visitor<bool> { eval() {} // bool operator()(const var& v) const { std::cout<<"feuille:\n"<<v<<std::endl; return true; } bool operator()(const binop<op_and>& b) const { recurse(b.oper1) && recurse(b.oper2); } bool operator()(const binop<op_or>& b) const { recurse(b.oper1) || recurse(b.oper2); } bool operator()(const unop<op_not>& u) const { return !recurse(u.oper1); } //------------adding others operators---------------------------- bool operator()(const binop<op_equal>& u) const { // will be implemented later return true; } bool operator()(const binop<op_not_equal>& u) const { // will be implemented later return true; } bool operator()(const binop<op_less>& u) const { // will be implemented later return true; } bool operator()(const binop<op_less_equal>& u) const { // will be implemented later return true; } bool operator()(const binop<op_greater>& u) const { // will be implemented later return true; } bool operator()(const binop<op_greater_equal>& u) const { // will be implemented later return true; }
謝謝。任何建議都是值得歡迎的。
有幫助!我想知道布爾表達式示例如何支持Unicode。我曾嘗試過: – user2891256
有幫助!我想知道布爾表達式示例如何支持Unicode。我已經在評估函數中使用了template(請參閱原始鏈接),而不是template 。謝謝。 –
user2891256
你不能只用一個ecoding替換一個隊長(IIRC'standard_wide'甚至是一個_namespace_?)。相反,只是[查看信息](http://stackoverflow.com/search?tab=votes&q=%5bboost-spirit%5d%20OR%20%5bboost-spirit-qi%5d%20unicode)。 Unicode與布爾表達式很少有關。對於這個問題,也沒有'wstring'。 [This](http://stackoverflow.com/questions/13679669/how-to-use-boostspirit-to-parse-utf-8/15820479#15820479)看起來很清楚 – sehe