2013-03-07 2 views
2
내가 real_parser를 사용하여 실수를 구문 분석하려고

다음과 같은 ureal_policies는 :정신 real_parser "합니다 .e"

template <typename T> 
struct number_real_policies : qi::ureal_policies<T> 
{ 
    static bool const expect_dot = true; 

    template <typename Iterator, typename Attribute> 
    static bool 
    parse_nan(Iterator& first, Iterator const& last, Attribute& attr) { 
     return false; 
    } 

    template <typename Iterator, typename Attribute> 
    static bool 
    parse_inf(Iterator& first, Iterator const& last, Attribute& attr) { 
     return false; 
    } 
}; 

완벽 내가 필요로하는 실수 형식의 모든 변화를 분석하는 것 그러나 나는 다음과 같은 것을 발견 문자열도 허용됩니다 : ".12345.e12".

소수 부분에 두 개의 점이 허용됩니다 (두 번째 점은 E/e 앞에 만 작동하고 E/e는 있어야 함). 사전에

덕분에

답변

1

@llonesmiz가 제대로 내 테스트 응용 프로그램에서 지적한 바와 같이,이 설계대로 정확히 작동합니다

Live On Coliru

그것은 당신이 파서를 확인하는 것을 잊지처럼 보인다 코드를 종료 하시겠습니까?

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

namespace qi = boost::spirit::qi; 
namespace karma = boost::spirit::karma; 

typedef std::vector<double> attr_t; 

template <typename T> 
struct number_real_policies : qi::ureal_policies<T> 
{ 
    static bool const expect_dot = true; 

    template <typename Iterator, typename Attribute> 
    static bool 
    parse_nan(Iterator& first, Iterator const& last, Attribute& attr) { 
     return false; 
    } 

    template <typename Iterator, typename Attribute> 
    static bool 
    parse_inf(Iterator& first, Iterator const& last, Attribute& attr) { 
     return false; 
    } 
}; 

template <typename It, typename Skipper = qi::space_type> 
    struct parser : qi::grammar<It, attr_t(), Skipper> 
{ 
    parser() : parser::base_type(start) 
    { 
     using namespace qi; 

     start %= *mydouble_; 
     BOOST_SPIRIT_DEBUG_NODE(start); 
    } 

    private: 
    qi::rule<It, attr_t(), Skipper> start; 
    qi::real_parser<double, number_real_policies<double> > mydouble_; 
}; 

bool doParse(const std::string& input) 
{ 
    typedef std::string::const_iterator It; 
    auto f(begin(input)), l(end(input)); 

    parser<It, qi::space_type> p; 
    attr_t data; 

    try 
    { 
     bool ok = qi::phrase_parse(f,l,p,qi::space,data); 
     if (ok) 
     { 
      std::cout << "parse success\n"; 
      std::cout << "data: " << 
       karma::format_delimited(karma::columns(3) [*karma::auto_], ' ', data) << "\n"; 
     } 
     else  std::cerr << "parse failed: '" << std::string(f,l) << "'\n"; 

     if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n"; 
     return ok; 
    } catch(const qi::expectation_failure<It>& e) 
    { 
     std::string frag(e.first, e.last); 
     std::cerr << e.what() << "'" << frag << "'\n"; 
    } 

    return false; 
} 

int main() 
{ 

    bool ok = doParse(
      "0. 2. .3 \n " 
      "0.e7 2.e7 .3e7 \n" 
      "0.e-7 2.e-7 .3e-7 \n" 
      // shouldn't accept: 
      //"0..e7\n" 
      "0.3.e7\n" 
      ); 
    return ok? 0 : 255; 
} 

출력 : 그것은 또한 ureal_policies와 함께 작동

parse success 
data: 0.0 2.0 0.3 
0.0 2.0e07 3.0e06 
0.0 2.0e-07 3.0e-08 
0.3 

trailing unparsed: '.e7 
' 
+0

. 결국에는 분석되지 않는 텍스트 만 있습니다. –

+0

[This] (http://liveworkspace.org/code/1uSkAG$0)는 작동하는 것처럼 보이며 1.53입니다. –

+0

나는 그것이 단지 qi :: parse의 반환을 검사하는 경우라고 생각한다. [this] (http://stackoverflow.com/questions/12864978/boost-spirit-signals-successful-parsing-despite-token-being-incomplete/12868247#12868247)와 동일합니다. –