Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghuraikan Ungkapan Boolean dengan Cekap dengan 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:
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>& 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!