Rumah > pembangunan bahagian belakang > C++ > Bagaimana Menghuraikan Ungkapan Boolean dan Membina Pokok Sintaks dalam C menggunakan Boost Spirit?

Bagaimana Menghuraikan Ungkapan Boolean dan Membina Pokok Sintaks dalam C menggunakan Boost Spirit?

Susan Sarandon
Lepaskan: 2024-12-27 02:56:13
asal
709 orang telah melayarinya

How to Parse Boolean Expressions and Construct Syntax Trees in C   using Boost Spirit?

Penghurai Tatabahasa Ungkapan Boolean dalam C

Masalah:

Uraikan ungkapan boolean yang diberikan sebagai rentetan dan bina pokok yang mewakili pokok sintaks ungkapan itu. Pokok itu hendaklah mengikut peraturan keutamaan (BUKAN, DAN, XOR, ATAU).

Jawapan:

Menggunakan Boost Spirit:

  1. Tentukan enum dengan tag yang mewakili pengendali (NOT, AND, XOR, ATAU).
  2. Tentukan jenis varian rekursif (expr) untuk mewakili nod pokok:

    • var: Nama pembolehubah
    • unop: Unary operator
    • binop: Pengendali binari
  3. Tentukan a tatabahasa menggunakan Boost Spirit Qi untuk menghuraikan ungkapan boolean.
  4. Buat kelas pelawat untuk melintasi ungkapan yang dihuraikan dan mencetaknya sebagai pokok.

Contoh Penggunaan:

using namespace qi;
using namespace phoenix;

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;

struct parser : grammar<It, expr(), Skipper> {
    parser() : parser::base_type(expr_) {
        not_ = ...
        or_  = ...
        xor_ = ...
        and_ = ...

        simple = '(' > expr_ > ')' | var_;
        var_ = lexeme[+alpha];
    }
    qi::rule<It, var(), Skipper> var_;
    qi::rule<It, expr(), Skipper> not_, and_, xor_, or_, simple, expr_;
};

int main() {
    std::string input = "(a and b) xor ((c and d) or (a and b));";
    const char *f = input.c_str(), *l = f + input.size();

    expr result;
    bool ok = phrase_parse(f, l, parser() > ';', qi::space, result);
    if (ok) {
        std::cout << result << '\n';
    }
}
Salin selepas log masuk

Hasil:

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

Atas ialah kandungan terperinci Bagaimana Menghuraikan Ungkapan Boolean dan Membina Pokok Sintaks dalam C menggunakan 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan