C 中的布尔表达式语法解析器
问题:
解析给定的布尔表达式一个字符串并构造一棵表示表达式语法树的树。树应遵循优先规则(NOT、AND、XOR、OR)。
答案:
使用 Boost Spirit:
定义一个递归变体类型(expr)来表示树节点:
示例用法:
using namespace qi; using namespace phoenix; typedef std::string var; template <typename tag> struct binop; template <typename tag> struct unop; typedef boost::variant<var, boost::recursive_wrapper<unop<op_not>>, boost::recursive_wrapper<binop<op_and>>, boost::recursive_wrapper<binop<op_xor>>, boost::recursive_wrapper<binop<op_or>>> expr; struct parser : grammar<It, expr(), Skipper> { parser() : parser::base_type(expr_) { not_ = ... or_ = ... xor_ = ... and_ = ... simple = '(' > expr_ > ')' | var_; var_ = lexeme[+alpha]; } qi::rule<It, var(), Skipper> var_; qi::rule<It, expr(), Skipper> not_, and_, xor_, or_, simple, expr_; }; int main() { std::string input = "(a and b) xor ((c and d) or (a and b));"; const char *f = input.c_str(), *l = f + input.size(); expr result; bool ok = phrase_parse(f, l, parser() > ';', qi::space, result); if (ok) { std::cout << result << '\n'; } }
结果:
((a and b) xor ((c and d) or (a and b)))
以上是如何使用 Boost Spirit 在 C 中解析布尔表达式并构建语法树?的详细内容。更多信息请关注PHP中文网其他相关文章!