Amacım, mantıksal bir ifade alacak bir işlev yazmaktır (örn: A VEYA DEĞİL (B VE C)) ve bunu normal değerlere dönüştürmek. (A VEYA DEĞİL B OR NOT C)Dilbilgisi alan ve ayrıştırma ağacı oluşturan bir ayrıştırıcı yazma
Ben mantıksal ifadeler
S => !S
S => (S)
S => S op S
S => W
op => AND | OR
W => A | B | C | ... | Z
üretecek bir gramer yazdım Bu yinelemeli ayrıştırmak bir ifade Sı
- olduğunu Yukarıdaki dilbilgisini kullanarak ve karşılık gelen ayrıştırma ağacını oluşturma ifadesi
- İfade herhangi bir NOT işleçlerini yineleyen "basitleştirerek" DNF'ye dönüştürün. ağacı.
- Son ayrıştırma ağacında yinelemeli olarak ilerleyin ve DNF mantıksal ifadesini çıkarın. Bir Çözümleme ağacının ile
Ben şimdiki düğümün ebeveyni kontrol ve ağaç aşağı iterek ya da (DEĞİL DEĞİL durumunda) ağacı yeniden düzenleyerek DEĞİL operatörleri kolaylaştırabilir. Sonra ağacı düzleştirmek için önemsiz.
Bu, kağıt üzerinde çalışır, ancak şimdi gerçek ayrıştırıcı ile sıkışmış durumdayım. Bu kuralları bir ayrıştırıcı sınıfına nasıl dönüştürebilirim? Dış kütüphaneleri kullanmak istemiyorum ve ayrıştırıcıyı sıfırdan yazmak istiyorum.
Dış araçları kullanmak istemiyorsanız, bu kitabı derleyici yapısının "İncil'i" öneriyorum: http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886 – Casper
Ayrıca bu harika bir dizi: http://www.rubyinside.com/writing-a-compiler-in-ruby-1222.html – Casper
Ve: http://stackoverflow.com/questions/1669/learning-to-write -a-compiler – Casper