Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menghuraikan Ungkapan Boolean dengan Cekap dengan Boost Spirit?

Bagaimana untuk Menghuraikan Ungkapan Boolean dengan Cekap dengan Boost Spirit?

DDD
Lepaskan: 2024-12-11 17:09:11
asal
859 orang telah melayarinya

How to Efficiently Parse Boolean Expressions with Boost Spirit?

Penghuraian Ungkapan Boolean menggunakan Semangat Boost

Masalah:

Cara menghuraikan ungkapan Boolean dengan cekap (menggunakan C ) yang mematuhi peraturan keutamaan, termasuk operasi seperti AND, OR, XOR dan TIDAK. Matlamatnya adalah untuk membina perwakilan seperti pokok bagi ungkapan yang mengekalkan susunan keutamaan.

Penyelesaian:

1. Jenis Data Abstrak (ADT) Pokok Ungkapan:

Untuk mewakili pepohon ungkapan, ADT ditakrifkan menggunakan boost::varian sokongan varian rekursif:

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

Di mana setiap jenis dalam varian mewakili nod dalam pepohon ungkapan:

  • var: Nod daun mewakili a pembolehubah
  • unop: Nod operator unari (cth., NOT)
  • binop: Nod operator binari (cth., AND, XOR, OR)

2 . Peraturan Tatabahasa:

Tatabahasa bebas konteks ditakrifkan untuk menentukan peraturan sintaks bagi ungkapan Boolean:

struct parser : qi::grammar<It, expr(), Skipper>
{
    parser() : parser::base_type(expr_)
    {
        using namespace qi;
        expr_  = or_.alias();
        ...
    }
};
Salin selepas log masuk

3. Menghuraikan dan Membina Pokok:

Menggunakan Boost Spirit, penghurai dijana berdasarkan peraturan tatabahasa. Penghurai menggunakan ungkapan input dan membina pepohon ungkapan yang sepadan.

expr result;
bool ok = qi::phrase_parse(f, l, p > ';', qi::space, result);
Salin selepas log masuk

4. Mencetak Pokok Ungkapan:

Pelawat cetakan pokok dilaksanakan untuk memaparkan pokok ungkapan dalam cara yang mesra pengguna:

struct tree_print : boost::static_visitor<void>
{
    void operator()(const binop<op_and>&amp; b) const { print("and ", b.oper1, b.oper2); }
    ...
};
Salin selepas log masuk

Contoh Penggunaan:

std::cout << "result: " << result << "\n";
Salin selepas log masuk

Output:

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

Pendekatan ini menyediakan rangka kerja yang mantap dan boleh diperluas untuk menghuraikan ungkapan Boolean dan membina perwakilan berstruktur untuk selanjutnya pemprosesan atau penilaian.

Atas ialah kandungan terperinci Bagaimana untuk Menghuraikan Ungkapan Boolean dengan Cekap dengan Boost Spirit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan