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 中国語 Web サイトの他の関連記事を参照してください。