2013-07-29 34 views
6

Derleyici arka planım yok, bu yüzden bu alandaki bir paylaşım olup olmadığından emin değilim. Bunun gibi ifadeleri ayrıştırmak için standart teknikler var mı? Bir yığın tabanlı değerlendirme başvurmak gerektiğinden emin değilimBu tür ifadeleri nasıl ayrıştırırım?

((A+B=1) AND (C+D=1) AND ((P+Q=1) OR (K=1)) AND ((Q=1) AND (R=2))) 

:

And 
    A + B = 1 
    C + D = 1 
    Or 
     P + Q = 1 
     K = 1 
    And 
     Q = 1 
     R = 2 

olarak çözümlenen mı (De ki, sekme derinliğini gösterir)? Şu anda bir tane deniyorum ve eğer koşabilirsem bir çalışma kodu göndereceğim.

Bunu başarmak için basit bir yolla herhangi bir öneriniz var mı?

+0

Bağlam nedir? "Güvenli" olmak zorunda mı? Ya da sözdizimini biraz değiştirebilir ve Python'u “eval()” veya benzeri ile kullanabilir misiniz? Örneğin, '((A + B == 1) ve (C + D == 1))' Python sözdizimi. –

+0

Maalesef, girişi değiştiremiyorum. Bazı XML dosyalarını ayrıştırıyorum ve ifadeleri kendileri bir dizeye ayrıştırmayı başardım. Dizgiyi nasıl biçimlendirdiğim bana göre değil, değerlendirme sırası ve hepsinin hala bakım ihtiyacı var.Ayrıca, bir şeyleri değerlendirmek istemiyorum ama söylemek istiyorum, baskı için bir ip alın. – Legend

+0

İfadeyi ağaçlara ayırıyor musunuz? Daha sonra bu değişkenler için sayıları altüst ederek onları değerlendirmek? – Adrian

cevap

3

Değişken öncelikleri ve ilişkilendirmeleri olan operatörler tarafından oluşturulan ifadelerin nasıl ayrıştırılacağını soruyorsunuz - kesinlikle. Bir etkin yaklaşım "yukarıdan aşağı operatör önceliği" ve belki "operatör önceliği" ve "öncelikli tırmanma" ayrıştırması olarak adlandırılır.

Gerçekten temiz olan şey, gerçekte ne kadar küçük bir kod almasıdır.

Anahtar kavramlar şunlardır: 3 + 4 * 5(3 + 4) * 5 veya 3 + (4 * 5) olarak ayrıştırılır: mixfix

  • öncelik vs Infix vs

    • önek?

    • ilişkilendirme: x - (y - z) veya (x - y) - z olarak ayrıştırıldı mı?

    Tesadüfen, ben sadece son zamanlarda bu bilgilerin öğrenilmesi ve here bulabilirsiniz operatör ayrıştırma benzer bir yaklaşımla, ilgili bloguma bir bir makale yazma sona erdi edilmiştir. Benim yaklaşımımda infix, önek, postfix ve mixfix operatörleri ile ilgileniyorum (yani ? :); Öncelikler ve ilişkilendirmeler tablolarda belirtilmiştir; Henüz işlenmemiş olan operatörleri takip etmek için bir yığın kullanıyorum. Ayrıştırıcı daha sonra her düğümün bir alt ifadesi olduğu bir ayrıştırma ağacı oluşturur.

  • +0

    +1 Linkler için teşekkürler. – Legend

    İlgili konular