2010-08-28 24 views
8

Ruh mini_c örnek kullanarak bazı testler yaptım. Ne yazık ki beklendiği gibi operatör öncelik tutmaz: 1Operatör önceliği boost :: spirit?

Ben tanımını taşımak için çalıştı 0.

return (3 > 10) || (3 > 1); 

getirilere

int main() 
{ 
    return 3 > 10 || 3 > 1; 
} 

değerlendirir "||" ve "& &" çok

template <typename Iterator> 
expression<Iterator>::expression(

kurucuları içindedir üst ama bu bir şeyi değiştirmez için. Bu nasıl düzeltilebilir? Ben 1.3.38 artırmak kullanıyorum.

+0

ben Boost.Spirit hiç kullanmadıysanız, ama yok tanımladığı her şeyin burada nasıl bir fark yaratabileceğini görün. İlkellerden başka bir şeyiniz yok ve yerleşik operatörlere aşırı yüklenemezsiniz. –

+0

Bu örnekle ilgili başka bir sorum var. Belki de bunun için yardım edebilirsin? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

cevap

7

Onaylandı, bu, operatör önceliği ile ilgili mini_c örneğindeki bir hata. Boost V1.45'te sunulacak olan SVN'ye bir karar verdim. İşte başlık dosyası mini_cb.hpp değişti budur:

eski kod:

equality_expr = 
    relational_expr 
    >> *( ("==" > relational_expr  [op(op_eq)]) 
     | ("!=" > relational_expr  [op(op_neq)]) 
     ) 
    ; 

relational_expr = 
    logical_expr 
    >> *( ("<=" > logical_expr  [op(op_lte)]) 
     | ('<' > logical_expr   [op(op_lt)]) 
     | (">=" > logical_expr  [op(op_gte)]) 
     | ('>' > logical_expr   [op(op_gt)]) 
     ) 
    ; 

logical_expr = 
    additive_expr 
    >> *( ("&&" > additive_expr  [op(op_and)]) 
     | ("||" > additive_expr  [op(op_or)]) 
     ) 
    ; 

yeni kod:

equality_expr = 
    logical_expr 
    >> *( ("==" > logical_expr  [op(op_eq)]) 
     | ("!=" > logical_expr  [op(op_neq)]) 
     ) 
    ; 

logical_expr = 
    relational_expr 
    >> *( ("&&" > relational_expr  [op(op_and)]) 
     | ("||" > relational_expr  [op(op_or)]) 
     ) 
    ; 

relational_expr = 
    additive_expr 
    >> *( ("<=" > additive_expr  [op(op_lte)]) 
     | ('<' > additive_expr  [op(op_lt)]) 
     | (">=" > additive_expr  [op(op_gte)]) 
     | ('>' > additive_expr  [op(op_gt)]) 
     ) 
    ; 
+0

Çok teşekkürler. Aynı şeyi denedim, ama tanımların içindeki parametreleri değiştirmeyi unuttum. –

+1

Merhaba Hartmut. Bugün - 1 1/2 yıl sonra, kodun hala doğru olmadığını öğrendim: "==" ve "&&" son olarak değerlendirilmelidir - önce "==" ve "! =", Daha önce değil. –

İlgili konular