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
DDDasal
2024-12-11 17:09:11834semak imbas

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;

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();
        ...
    }
};

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);

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); }
    ...
};

Contoh Penggunaan:

std::cout << "result: " << result << "\n";

Output:

result: ((a and b) xor ((c and d) or (a and b)))

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:
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