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()
.
Daripada fungsi yang memiliki tanda tangan:
Berikan tanda tangan:
Kemudian
if
fungsi Anda akan memanggil fungsi yang sesuai berdasarkan kondisi, hanya mengevaluasi salah satunya.sumber
Sangat mudah, jika Anda menyusun semuanya dengan malas. Anda harus memiliki beberapa cara untuk melihat apakah suatu nilai sudah dievaluasi, atau jika perlu lebih banyak evaluasi.
Kemudian Anda dapat melakukan hal berikut: Jika itu adalah literal atau variabel (apakah Anda memiliki itu ?, yaitu nama fungsi?), Dorong pada tumpukan. Jika ini merupakan aplikasi dari suatu fungsi, kompilasi secara terpisah, dan dorong titik masuk pada tumpukan.
Eksekusi program adalah, kemudian, hanya pengulangan sampai bagian atas tumpukan dievaluasi dan bukan fungsi. Jika tidak dievaluasi atau berfungsi, panggil kode bagian atas tumpukan.
sumber