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

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

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

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

C のブール式パーサー

はじめに

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

Boost Spirit を使用した解析

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#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.

1

2

3

4

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;

ログイン後にコピー

出力

1

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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート