ホームページ > バックエンド開発 > C++ > Boost Spirit を使用して C でブール式を解析し、構文ツリーを構築する方法

Boost Spirit を使用して C でブール式を解析し、構文ツリーを構築する方法

Susan Sarandon
リリース: 2024-12-27 02:56:13
オリジナル
622 人が閲覧しました

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

C のブール式文法パーサー

問題:

として与えられたブール式を解析します文字列を取得し、式の構文ツリーを表すツリーを構築します。ツリーは優先規則 (NOT、AND、XOR、OR) に従う必要があります。

答え:

Boost Spirit の使用:

  1. 演算子を表すタグを含む列挙型を定義します (そうではありません)。 AND、XOR、OR)。
  2. ツリー ノードを表す再帰的バリアント型 (expr) を定義します:

    • var: 変数名
    • unop : 単項演算子
    • binop: バイナリ演算子
  3. Boost Spirit Qi を使用してブール式を解析する文法を定義します。
  4. 解析された式をトラバースし、ツリーとして出力するビジター クラスを作成します。

例使用法:

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート