2010-11-18 12 views
3

Bir MSBuild koşul ayrıştırıcısı yazmaya çalışıyorum. Koşullar here'da tarif edilmiştir. Basit bir MSBuild koşul ayrıştırıcısı yazma

yüzden sorunsuz görünen bir dilbilgisi ile geldim:

S -> !S 
S -> S == S 
S -> S != S 
S -> S && S 
S -> S || S 
S -> Fn(str) 
S -> str == str 
S -> str != str 
S -> n < n 
S -> n <= n 
S -> n > n 
S -> n >= n 

Bu benim ihtiyaçlarına uygun görünüyor ve ben bu basit bir dil tanımlamak C++ sınıflarının kümesi ile geldim. Yani, yukarıda belirttikleri sınıfları oluşturabilirim ve sonra temel ifadede "koş" diyebilirim ve diğer uçtan boole değeri elde edebilirim. (! Ve kod dev satırını affet;): Aşağıdaki bu dili kullanma

(!Exists("C:\\config.sys") && 14 < 17) || (AString == AString2 && HasTrailingSlash("C:")) 

olarak tanımlanır olur) şu şekildedir:

Statement baseStatement(new StatementOrStatement(new StatementAndStatement(new NotStatement(new ExistsFunctionStatement("C:\\Config.sys")), new NumberLessThanNumberStatement(14.0, 17.0)), new StatementAndStatement(new StringEqualStringStatement("AString", "AString2"), new HasTrailingSlashFunctionStatement("C:\\")))); 

Ben sadece yukarıdaki ifadeyi çalıştırabilirsiniz:

const bool result = baseStatement.Run(); 

Şu ana kadar her şey yolunda. Dilbilgisi kullanarak tüm "dili" temsil edebilirim ve dilbilgisini geçerli bir tam açıklama haline getirebilirim.

Ancak şimdi bir sonraki sorunum var. Aslında dizeyi ayrıştırmam gerek. Nerede başlayacağımı bilmiyorum. Birisi, asıl ifadeyi yukarıdaki C++ sınıfları kümesine ayrıştırmak için asıl dizge ayrıştırıcısını nasıl yazdığım konusunda bana yardımcı olabilir mi? Bu cephede daha çok kayboldum.

Bunu tamamen kendi öğrenme nedenlerim için yapıyorum, bu yüzden bir başkasının ayrıştırıcı kitaplığını kullanmak istemiyorum.

Şimdiden teşekkürler!

+0

Hiç bu anlamaya mı zaten var? Sonuçlarla ilgilenirim. –

cevap

1
+0

Şerefe, uni'de bir dil işlemcisi kursu aldım .. ama 13 yıl önceydi ... “Recursive Descent” gibi ayrıştırıcıların isimlerini unutmuştum. Bu bana bakmaya başlamak için bir yer veriyor. Yine de kıçına daha açık bir vuruş yapmaya devam ediyorum: D – Goz