2012-11-07 13 views
8

का उपयोग करके पार्स int या डबल पार्स मैं एक स्ट्रिंग को एक इंट या डबल के रूप में पार्स करने का एक तरीका ढूंढ रहा हूं, पार्सर को दोनों विकल्पों को आजमाएं और इनपुट स्ट्रीम के सबसे लंबे हिस्से से मेल खाने वाले किसी को चुनना चाहिए।बूस्ट भावना (longest_d)

नहीं है में बहिष्कृत निर्देश (longest_d) है कि वास्तव में क्या मैं के लिए देख रहा हूँ है:

number = longest_d[ integer | real ]; 

... के बाद से यह पदावनत है, वहाँ कोई अन्य विकल्प है? वांछित व्यवहार प्राप्त करने के लिए एक अर्थपूर्ण कार्रवाई को लागू करना आवश्यक है, क्या किसी के पास कोई सुझाव है?

उत्तर

13

सबसे पहले, आत्मा V2 पर स्विच करें - जिसने शास्त्रीय भावनाओं को कई वर्षों से हटा दिया है।

दूसरा, आपको यह सुनिश्चित करना होगा कि एक int को प्राथमिकता दी जाए। डिफ़ॉल्ट रूप से, एक डबल किसी भी पूर्णांक समान रूप से अच्छी तरह से पार्स कर सकते हैं, तो आप के बजाय strict_real_policies उपयोग करने की आवश्यकता:

real_parser<double, strict_real_policies<double>> strict_double; 

अब आप बस कह सकते हैं

number = strict_double | int_; 

देखें

परीक्षण कार्यक्रम देखें Live on Coliru

#include <boost/spirit/include/qi.hpp> 

using namespace boost::spirit::qi; 

using A = boost::variant<int, double>; 
static real_parser<double, strict_real_policies<double>> const strict_double; 

A parse(std::string const& s) 
{ 
    typedef std::string::const_iterator It; 
    It f(begin(s)), l(end(s)); 
    static rule<It, A()> const p = strict_double | int_; 

    A a; 
    assert(parse(f,l,p,a)); 

    return a; 
} 

int main() 
{ 
    assert(0 == parse("42").which()); 
    assert(0 == parse("-42").which()); 
    assert(0 == parse("+42").which()); 

    assert(1 == parse("42.").which()); 
    assert(1 == parse("0.").which()); 
    assert(1 == parse(".0").which()); 
    assert(1 == parse("0.0").which()); 
    assert(1 == parse("1e1").which()); 
    assert(1 == parse("1e+1").which()); 
    assert(1 == parse("1e-1").which()); 
    assert(1 == parse("-1e1").which()); 
    assert(1 == parse("-1e+1").which()); 
    assert(1 == parse("-1e-1").which()); 
} 
+0

ऐसा नहीं है कि मैं सवाल का परिदृश्य समझ में नहीं आता, लेकिन नहीं 'संख्या = double_ हैं संभव है | int_' बस काम? –

+0

@sehe, बहुत बहुत धन्यवाद, यह एक आकर्षण की तरह काम करता है। –

+1

@llonesmiz हां, real_parser >() | int_ भी ठीक काम करता है। –

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