Analyseur de grammaire d'expression booléenne en C
Problème :
Analyser une expression booléenne donnée comme une chaîne et construisez un arbre représentant l’arbre syntaxique de l’expression. L'arbre doit suivre les règles de priorité (NOT, AND, XOR, OR).
Réponse :
Utilisation de Boost Spirit :
Définissez un type de variante récursive (expr) pour représenter les nœuds de l'arbre :
Exemple d'utilisation :
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'; } }
Résultat :
((a and b) xor ((c and d) or (a and b)))
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!