ホームページ > バックエンド開発 > C++ > Boost Spirit ライブラリを使用して C でブール式を解析するにはどうすればよいですか?

Boost Spirit ライブラリを使用して C でブール式を解析するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-04 05:54:13
オリジナル
746 人が閲覧しました

How can I parse Boolean expressions in C   using the Boost Spirit library?

C のブール式パーサー

はじめに

ブール式の解析は、コンピューター サイエンスの基本的なタスクです。これには、人間が読める式をコンピュータが解釈できるデータ構造に変換することが含まれます。

Boost Spirit を使用した解析

ブール式を解析する一般的なアプローチの 1 つは、Boost Spirit ライブラリを使用することです。 Spirit は、文法の定義と解析のための強力で柔軟なフレームワークを提供します。

Spirit に基づく C 実装は次のとおりです:

#include <boost/spirit/include/qi.hpp>
#include <boost/variant/recursive_wrapper.hpp>

using namespace boost::spirit;
using namespace boost::spirit::qi;

struct op_or  {};
struct op_and {};
struct op_xor {};

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;

template <typename tag> struct binop 
{ 
    explicit binop(const expr&amp; l, const expr&amp; r) : oper1(l), oper2(r) { }
    expr oper1, oper2; 
};

template <typename tag> struct unop  
{ 
    explicit unop(const expr&amp; o) : oper1(o) { }
    expr oper1; 
};

template <typename It, typename Skipper = qi::space_type>
    struct parser : qi::grammar<It, expr(), Skipper>
{
    parser() : parser::base_type(expr_)
    {
        using namespace qi;

        expr_  = or_.alias();
        not_ = ("not" > simple       ) [ _val = phx::construct<unop <op_not> >(_1)     ] | simple [ _val = _1 ];
        or_  = (xor_ >> "or"  >> or_ ) [ _val = phx::construct<binop<op_or> >(_1, _2) ] | xor_   [ _val = _1 ];
        xor_ = (and_ >> "xor" >> xor_) [ _val = phx::construct<binop<op_xor> >(_1, _2) ] | and_   [ _val = _1 ];
        and_ = (not_ >> "and" >> and_) [ _val = phx::construct<binop<op_and> >(_1, _2) ] | not_   [ _val = _1 ];

        simple = (('(' > expr_ > ')') | var_);
        var_ = qi::lexeme[ +alpha ];
    }
  private:
    qi::rule<It, var() , Skipper> var_;
    qi::rule<It, expr(), Skipper> not_, and_, xor_, or_, simple, expr_;
};
ログイン後にコピー

使用法

パーサーを使用するには:

  1. パーサーのインスタンスを作成するclass.
  2. ブール式を適切な反復子およびスキッパー型とともに解析関数に渡します。
  3. 結果は、解析された値を含む boost::variant になります。 expression.

auto expr = "a and b xor (c and d or a and b);";
expr parsed_expr;
qi::parse(expr.begin(), expr.end(), parser<std::string::const_iterator>(), parsed_expr);
std::cout << "Parsed expression: " << parsed_expr << std::endl;
ログイン後にコピー

出力

Parsed expression: ((a and b) xor ((c and d) or (a and b)))
ログイン後にコピー

結論

この実装では、Boost Spirit の再帰降下パーサー ジェネレーターを利用して、解析された式を表す構文ツリー。優先順位ルールを正しく処理し、式の論理構造を正確に捉えるツリーを生成します。

以上がBoost Spirit ライブラリを使用して C でブール式を解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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