2016-11-29 27 views
2

我試過使用qi::uint_parser<int>()。但它與qi::uint_相同。它們全部匹配整數範圍從0std::numeric_limits<unsigned int>::max()如何編寫一個boost :: spirit :: qi解析器來解析從0到std :: numeric_limits的整數範圍<int> :: max()?

qi::uint_parser<int>()這樣設計的?我應該使用什麼語法分析器來匹配從0std::numeric_limits<int>::max()的整數範圍?謝謝。

+0

的可能的複製[約束existin g Boost.Spirit real \ _parser(with a policy)](http://stackoverflow.com/questions/30375750/constraining-the-existing-boost-spirit-real-parser-with-a-policy) – sehe

回答

4

最簡單的演示,附加語義動作做範圍檢查:

uint_ [ _pass = (_1>=0 && _1<=std::numeric_limits<int>::max()) ]; 

Live On Coliru

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

template <typename It> 
struct MyInt : boost::spirit::qi::grammar<It, int()> { 
    MyInt() : MyInt::base_type(start) { 
     using namespace boost::spirit::qi; 
     start %= uint_ [ _pass = (_1>=0 && _1<=std::numeric_limits<int>::max()) ]; 
    } 
    private: 
    boost::spirit::qi::rule<It, int()> start; 
}; 

template <typename Int> 
void test(Int value, char const* logical) { 
    MyInt<std::string::const_iterator> p; 

    std::string const input = std::to_string(value); 
    std::cout << " ---------------- Testing '" << input << "' (" << logical << ")\n"; 

    auto f = input.begin(), l = input.end(); 
    int parsed; 
    if (parse(f, l, p, parsed)) { 
     std::cout << "Parse success: " << parsed << "\n"; 
    } else { 
     std::cout << "Parse failed\n"; 
    } 

    if (f!=l) { 
     std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n"; 
    } 
} 

int main() { 
    unsigned maxint = std::numeric_limits<int>::max(); 

    MyInt<std::string::const_iterator> p; 

    test(maxint , "maxint"); 
    test(maxint-1, "maxint-1"); 
    test(maxint+1, "maxint+1"); 
    test(0  , "0"); 
    test(-1  , "-1"); 
} 

打印

---------------- Testing '2147483647' (maxint) 
Parse success: 2147483647 
---------------- Testing '2147483646' (maxint-1) 
Parse success: 2147483646 
---------------- Testing '2147483648' (maxint+1) 
Parse failed 
Remaining unparsed: '2147483648' 
---------------- Testing '0' (0) 
Parse success: 0 
---------------- Testing '-1' (-1) 
Parse failed 
Remaining unparsed: '-1' 
+0

謝謝!我認爲'_1> = 0'不需要語義動作,因爲'uint_'已經完成了這項工作。我仍然好奇,qi :: uint_parser '和'qi :: uint_parser '之間是否有區別?看起來數字基類型「T」所需的'std :: numeric_limits :: max()'在這裏沒有使用。 – Han

相關問題