2014-02-08 2 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?

Anyways, +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"; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^