a=b & s<9 または単純に a=b などのブール式を比較演算子のみ (|、&、! などの論理演算子なし) で評価したいと考えています。次の AST を使用できます。
=
/ \
/ \
a b
また
&
/ \
/ \
= <
/ \ /\
/ \ / \
a b s 9
葉ノードは値です。Leave ノードの親は常に =、!=、<、>、>=、<= などの比較演算子です。比較ノードの親は、論理演算子 |、&、および ! です。親ノードから値ノード (葉) にアクセスし、これらの値を別の関数 (後で実装されます) に渡したいと思います。解析ステップは問題ありません。
親ノードから値ノード (葉) にアクセスする方法。私は次の例を使用しています: スピリットでブール式を計算する方法
c++ のブール式 (文法) パーサーこれ は、次のリンクから取得した評価コードです。
struct eval : boost::static_visitor<bool> { eval() {} /// bool operator()(const var& v) const { std::cout<<"feuille:\n"<<v<<std::endl; true を返します。 } bool operator()(const binop<op_and>& b) const { 再帰 (b.oper1) && 再帰 (b.oper2); } bool operator()(const binop<op_or>& b) const { 再帰 (b.oper1) || 再帰 (b.oper2); } bool operator()(const unop<op_not>& u) const { return !recurse(u.oper1); } //------------他の演算子の追加-------------------------------- bool operator()(const binop<op_equal>& u) const { // 後で実装されます true を返します。 } bool operator()(const binop<op_not_equal>& u) const { // 後で実装されます true を返します。 } bool operator()(const binop<op_less>& u) const { // 後で実装されます true を返します。 } bool operator()(const binop<op_less_equal>& u) const { // 後で実装されます true を返します。 } bool operator()(const binop<op_greater>& u) const { // 後で実装されます true を返します。 } bool operator()(const binop<op_greater_equal>& u) const { // 後で実装されます true を返します。 }
ありがとうございました。どんな提案でも大歓迎です。