2010-08-28 14 views
8

मैंने भावना मिनी_c नमूना का उपयोग करके कुछ परीक्षण किए हैं। दुर्भाग्य से यह ऑपरेटर पूर्वता अपेक्षा के अनुरूप नहीं रखता: 1बूस्ट :: भावना में ऑपरेटर प्राथमिकता?

मैं की परिभाषा को स्थानांतरित करने की कोशिश की 0.

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

रिटर्न के लिए

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

का मूल्यांकन करता है "||" और "& &"

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

के निर्माता में बहुत ऊपर लेकिन वह कुछ भी नहीं बदलता है करने के लिए। यह कैसे तय किया जा सकता है। मैं बढ़ावा 1.3.38 का उपयोग कर रहा हूँ।

+0

मैं Boost.Spirit उपयोग नहीं किया है, लेकिन मुझे नहीं पता देखें कि यह कैसे परिभाषित करता है, संभवतः यहां एक अंतर बना सकता है। आपके पास प्राइमेटिव्स के अलावा कुछ भी नहीं है, और आप अंतर्निहित ऑपरेटरों को अधिभारित नहीं कर सकते हैं। –

+0

मेरे पास इस नमूने पर विचार करने का एक और सवाल है। शायद आप भी इसके साथ मदद कर सकते हैं? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

उत्तर

7

पुष्टि की, यह ऑपरेटर प्राथमिकता से संबंधित mini_c उदाहरण में एक बग है। मैंने एसवीएन को एक फिक्स किया, जो बूस्ट वी .1.45 में उपलब्ध होगा। यहाँ है कि मैं क्या हेडर फाइल mini_cb.hpp में बदल रहा है:

पुराने कोड:

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)]) 
     ) 
    ; 

नए कोड:

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

बहुत बहुत धन्यवाद। मैंने कोशिश की, लेकिन मैं परिभाषाओं के अंदर पैरामीटर को संशोधित करना भूल गया। –

+1

हैलो हार्टमूट। आज - 1 1/2 साल बाद मुझे पता चला कि कोड अभी भी सही नहीं है: "==" और "&&" का मूल्यांकन अंतिम रूप से किया जाना चाहिए - "==" और "! =" के बाद, पहले नहीं। –

संबंधित मुद्दे