2014-02-08 3 views
1

나는 다음과 같은 코드가 있습니다부스트 정신, 어떠한 인용 문자열 향상 - 컴파일시 에러

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

#include <iostream> 
#include <string> 

template <typename Iterator> 
struct parser : boost::spirit::qi::grammar<Iterator, boost::any(), boost::spirit::qi::ascii::space_type> 
{ 
    parser() : parser::base_type(start) 
    { 
    start %= boost::spirit::qi::int_ | boost::spirit::qi::lexeme['"' >> +(boost::spirit::qi::char_ - '"') >> '"']; // example: 0 or "str" 
    } 

    boost::spirit::qi::rule<Iterator, boost::any(), boost::spirit::qi::ascii::space_type> start; 
}; 

int main() 
{ 
    const std::string input_data("\"str\""); 

    boost::any var = 0; 
    auto itr = input_data.begin(); 
    auto end = input_data.end(); 
    parser<decltype(itr)> g; 
    bool res = boost::spirit::qi::phrase_parse(itr, end, g, boost::spirit::ascii::space, var); 
    if (res && itr == end) 
    { 
    std::cout << "Parsing succeeded \n"; 
    try 
    { 
     std::cout << boost::any_cast<std::string>(var) << '\n'; 
    } 
    catch (const boost::bad_any_cast& ex) 
    { 
     std::cerr << ex.what() << '\n'; 
    } 
    } 
    else 
    { 
    std::cout << "Parsing failed \n"; 
    } 
} 

그것은 내가

boost::spirit::qi::lexeme['"' >> +(boost::spirit::qi::char_ - '"') >> '"'] 

내가 여기 오류를 게시 할 수 없습니다 추가 할 때까지 잘 컴파일 그리고 글자 수 제한 때문에 pastie.org에.

내가 뭘 잘못하고 있니? 어떻게 해결할 수 있습니까?

답변

1

다시 는 왜 문제를 복잡하게 할 것boost::any를 사용하여 속도를 느리게하는?

어쨌든 +char_std::vector<char>을 노출하며 속성 호환성 규칙은 무엇을 변환할지 결정하기를 원하지 않습니다.

는 명시 적 as_string으로 확인 : Live On Coliru

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

#include <iostream> 
#include <string> 

template <typename Iterator> 
struct parser : boost::spirit::qi::grammar<Iterator, boost::any(), boost::spirit::qi::ascii::space_type> 
{ 
    parser() : parser::base_type(start) 
    { 
     using namespace boost::spirit::qi; 
     start %= int_ | as_string [ lexeme['"' >> +(char_ - '"') >> '"'] ]; // example: 0 or "str" 
    } 

    boost::spirit::qi::rule<Iterator, boost::any(), boost::spirit::qi::ascii::space_type> start; 
}; 

int main() 
{ 
// const std::string input_data("\"str\""); 
    const std::string input_data("123"); 
    for (std::string const& input_data : { "\"str\"", "123" }) 
    { 
     boost::any var = boost::none; 
     auto itr = input_data.begin(); 
     auto end = input_data.end(); 
     parser<decltype(itr)> g; 
     bool res = boost::spirit::qi::phrase_parse(itr, end, g, boost::spirit::ascii::space, var); 
     if (res && itr == end) 
     { 
      std::cout << "Parsing succeeded \n"; 
      try { std::cout << boost::any_cast<int>  (var) << '\n'; } catch (const boost::bad_any_cast& ex) { std::cerr << ex.what() << '\n'; } 
      try { std::cout << boost::any_cast<std::string>(var) << '\n'; } catch (const boost::bad_any_cast& ex) { std::cerr << ex.what() << '\n'; } 
     } 
     else 
     { 
      std::cout << "Parsing failed \n"; 
     } 
    } 
}