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
Libérer: 2024-12-27 02:56:13
original
622 Les gens l'ont consulté

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';
    }
}
Copier après la connexion

Résultat :

((a and b) xor ((c and d) or (a and b)))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal