2012-10-27 17 views
5

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ı

  • Verilen benim algoritması

    1. olduğunu Yukarıdaki dilbilgisini kullanarak ve karşılık gelen ayrıştırma ağacını oluşturma ifadesi
    2. İfade herhangi bir NOT işleçlerini yineleyen "basitleştirerek" DNF'ye dönüştürün. ağacı.
    3. 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.

  • +0

    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

    +0

    Ayrıca bu harika bir dizi: http://www.rubyinside.com/writing-a-compiler-in-ruby-1222.html – Casper

    +0

    Ve: http://stackoverflow.com/questions/1669/learning-to-write -a-compiler – Casper

    cevap

    1

    Treetop'a bir göz atın, ne istersen onu yapabilir. http://treetop.rubyforge.org/

    +1

    [citrus] (https://github.com/mjijackson/citrus) bu ailenin başka bir üyesidir. Yinelemeli iniş gerektiğinde işe yaramaz, ancak dilbilgisi taşlar için uygun bir formda masaj yapılabilir. – x1a4

    İlgili konular