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
623 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!

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