Şu anda aşağıdakilere dayalı bir ifade değerlendiricisini (formül gibi tek satır ifadeleri) kullanıyorum:
- girilen ifade, değişmez booleanları, tam sayıları, ondalıkları, dizeleri, işlevleri, tanımlayıcıları (değişkenleri) ayırmak için tokenleştirilir
- Parantezden kurtulmak ve operatörleri iyi bir önceliğe sahip bir şekilde sipariş vermek için Shunting-yard algoritmasını (değişken değişkenli fonksiyonları işlemek için hafifçe değiştirildi) uyguladım
- manevra alanım basitçe (simüle edilmiş) bir token kuyruğu üretir (bir dizi aracılığıyla, Powerbuilder Klasik dilim nesneleri tanımlayabilir, ancak sıralı olarak değerlendirdiğim yalnızca yerel depolama olarak dinamik dizilere sahiptir - gerçek liste değil, sözlük yok) basit yığın makinesi
Değerlendiricim iyi çalışıyor, ancak hala bir eksikim if()
ve nasıl devam edeceğimizi merak ediyorum.
Benim manevra sonrası düzeltilmiş ve yığın tabanlı değerlendirme if()
ile, doğru ve yanlış parçaları ile başka bir işlev olarak eklerseniz , tek bir if(true, msgbox("ok"), msgbox("not ok"))
göstermek istiyorum iken tek bir her iki iletileri gösterecektir. Çünkü bir işlevi değerlendirmem gerektiğinde, tüm argümanları zaten değerlendirilmiş ve yığına yerleştirilmiştir.
if()
Tembel bir şekilde uygulamak için bana bir yol verebilir misiniz ?
Bunları bir tür makro olarak işlemeyi düşünüyorum, ama erken zamanda henüz durum değerlendirmesi yapmadım. Belki de koşulu ve doğru / yanlış ifadeleri ayrı tutmak için sıradan başka bir yapı kullanmam gerektiğini mi? Şimdilik ifade değerlendirmeden önce ayrıştırılıyor, ancak aynı zamanda ara gösterimi gelecekteki değerlendirme için önceden derlenmiş ifade olarak saklamayı da planlıyorum.
Düzenleme : sorun olsa bazı sonra, ben kolayca bir ya da başka bir dalı görmezden olabilir benim ifade (doğrusal bir belirteci akışı yerine bir AST) bir ağaç temsili inşa edebilirsiniz düşünüyorum if()
.