我想评估布尔表达式,例如 a=b & s<9 或仅使用比较运算符(没有逻辑运算符,例如 |、& 和!)的 a=b。我们可以有以下 AST:
=
/ \
/ \
a b
或者
&
/ \
/ \
= <
/ \ /\
/ \ / \
a b s 9
叶节点是值。离开节点的父节点始终是比较运算符,例如 =、!=、<、>、>=、<=。比较节点的父节点是逻辑运算符 |、& 和 !。我想从它们的父节点访问值节点(叶子),然后将这些值传递给另一个函数(稍后将实现)。解析步骤没问题。
如何从其父节点访问值节点(叶子)。我正在使用示例: 如何在 Spirit 中计算布尔表达式
和 c++ 中的布尔表达式(语法)解析器 这是取自以下链接的评估代码:
结构 eval : boost::static_visitor<bool> { 评估(){} // bool operator()(const var& v) const { std::cout<<"feuille:\n"<<v<<std::endl; 返回真; } 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 { 返回 !recurse(u.oper1); } //------------添加其他操作符---------------------------- bool operator()(const binop<op_equal>& u) const { // 稍后实现 返回真; } bool operator()(const binop<op_not_equal>& u) const { // 稍后实现 返回真; } bool operator()(const binop<op_less>& u) const { // 稍后实现 返回真; } bool operator()(const binop<op_less_equal>& u) const { // 稍后实现 返回真; } bool operator()(const binop<op_greater>& u) const { // 稍后实现 返回真; } bool operator()(const binop<op_greater_equal>& u) const { // 稍后实现 返回真; }
谢谢你。欢迎任何建议。