Maison >développement back-end >C++ >Comment analyser des expressions booléennes et construire des arbres de syntaxe en C à l'aide de Boost Spirit ?

Comment analyser des expressions booléennes et construire des arbres de syntaxe en C à l'aide de Boost Spirit ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-27 02:56:13626parcourir

How to Parse Boolean Expressions and Construct Syntax Trees in C   using Boost Spirit?

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 :

  1. Définissez une énumération avec des balises représentant les opérateurs (NOT, AND, XOR, OR).
  2. Définissez un type de variante récursive (expr) pour représenter les nœuds de l'arbre :

    • var : Nom de la variable
    • unop : Opérateur unaire
    • binop : Opérateur binaire
  3. Définir une grammaire en utilisant Boost Spirit Qi pour analyser l'expression booléenne.
  4. Créez une classe de visiteur pour parcourir l'expression analysée et imprimez-la sous forme d'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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn