Saat ini saya menerapkan evaluator ekspresi (ekspresi garis tunggal, seperti rumus) berdasarkan hal berikut:
- ekspresi yang dimasukkan tokenized untuk memisahkan boolean literal, integer, desimal, string, fungsi, pengidentifikasi (variabel)
- Saya menerapkan algoritma Shunting-yard (sedikit dimodifikasi untuk menangani fungsi dengan sejumlah variabel argumen) untuk menyingkirkan tanda kurung dan memesan operator dengan prioritas yang layak dalam urutan postfixed
- halaman shunting-saya hanya menghasilkan antrian token (disimulasikan) (melalui array, bahasa Powerbuilder Classic saya dapat mendefinisikan objek, tetapi hanya memiliki array dinamis sebagai penyimpanan asli - bukan daftar yang benar, tidak ada kamus) yang saya evaluasi secara berurutan dengan mesin tumpukan sederhana
Penilai saya bekerja dengan baik, tetapi saya masih kehilangan if()
dan saya bertanya-tanya bagaimana untuk melanjutkan.
Dengan evaluasi shunting-yard postfixed dan stack-based saya, jika saya menambahkan if()
sebagai fungsi lain dengan bagian yang benar dan salah, satu if(true, msgbox("ok"), msgbox("not ok"))
akan menampilkan kedua pesan sementara saya hanya ingin menunjukkan satu. Ini karena ketika saya perlu mengevaluasi suatu fungsi, semua argumennya telah dievaluasi dan ditempatkan di tumpukan.
Bisakah Anda memberi saya beberapa cara untuk diterapkan if()
dengan cara yang malas?
Saya berpikir tentang memproses ini sebagai semacam makro, tetapi pada saat awal saya belum evaluasi kondisi. Mungkin saya perlu menggunakan jenis struktur selain antrian untuk menjaga secara terpisah kondisi dan ekspresi benar / salah? Untuk saat ini ekspresi diuraikan sebelum evaluasi, tetapi saya juga berencana untuk menyimpan representasi perantara sebagai jenis ekspresi yang dikompilasi untuk evaluasi di masa depan.
Sunting : setelah beberapa masalah, saya pikir saya bisa membangun representasi pohon ekspresi saya (AST bukannya aliran token linier), dari mana saya dapat dengan mudah mengabaikan satu atau cabang lain dari saya if()
.