Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menghuraikan ungkapan Boolean dalam C menggunakan perpustakaan Boost Spirit?

Bagaimanakah saya boleh menghuraikan ungkapan Boolean dalam C menggunakan perpustakaan Boost Spirit?

Barbara Streisand
Lepaskan: 2024-12-04 05:54:13
asal
723 orang telah melayarinya

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

Penghurai Ungkapan Boolean dalam C

Pengenalan

Menghuraikan ungkapan boolean ialah tugas asas dalam sains komputer. Ia melibatkan penukaran ungkapan yang boleh dibaca manusia kepada struktur data yang boleh ditafsirkan oleh komputer.

Menghuraikan Menggunakan Boost Spirit

Satu pendekatan popular untuk menghuraikan ungkapan boolean ialah menggunakan perpustakaan Boost Spirit. Spirit menyediakan rangka kerja yang berkuasa dan fleksibel untuk mentakrif dan menghuraikan tatabahasa.

Berikut ialah pelaksanaan C berdasarkan Spirit:

#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_;
};
Salin selepas log masuk

Penggunaan

Untuk menggunakan penghurai:

  1. Buat contoh penghurai class.
  2. Lepaskan ungkapan boolean kepada fungsi parse bersama-sama dengan jenis iterator dan skipper yang sesuai.
  3. Hasilnya akan menjadi rangsangan::varian yang mengandungi dihuraikan ungkapan.

Contoh

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;
Salin selepas log masuk

Output

Parsed expression: ((a and b) xor ((c and d) or (a and b)))
Salin selepas log masuk

Kesimpulan

Pelaksanaan ini menggunakan penjana parser turunan rekursif Boost Spirit untuk membina pokok sintaks yang mewakili ungkapan yang dihuraikan. Ia mengendalikan peraturan keutamaan dengan betul, menghasilkan pokok yang menangkap struktur logik ungkapan dengan tepat.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghuraikan ungkapan Boolean dalam C menggunakan perpustakaan Boost Spirit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan