2016-07-21 3 views
1

Как разобрать в std :: string с boost spirit и phoenix?boost spirit и phoenix parsing в std :: string

Например, ниже я успешно разбираю 1234 в int, но когда я пытаюсь разобрать в строку, синтаксический анализ не выполняется. Если я заменяю на +qi::alnum, тогда синтаксический анализ удастся, но номер строки имеет нежелательное значение «4». Кажется, что qi :: alnum соответствует только одному символу; как я разбираю многосимвольную буквенно-цифровую строку?

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

#include <iostream> 
#include <string> 

int main() { 

    namespace qi = boost::spirit::qi; 
    namespace phoenix = boost::phoenix; 

    std::string s("--1234--"); 

    { 
     int number = 0; 
     bool success = qi::parse(s.begin(), s.end(), 
       qi::lit("--") >> qi::int_[ phoenix::ref(number) = qi::_1 ] >> qi::lit("--") 
      ); 
     std::cout << success << " qi::int_ parses: " << number << std::endl; 
    } 

    { 
     std::string number; 
     bool success = qi::parse(s.begin(), s.end(), 
       qi::lit("--") >> qi::alnum[ phoenix::ref(number) = qi::_1 ] >> qi::lit("--") 
      ); 
     std::cout << success << " qi::alpha parses: " << number << std::endl; 
    } 

    return 0; 
} 

ответ

1

Использовать qi::as_string, т.е.

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

#include <iostream> 
#include <string> 

int main() { 

    namespace qi = boost::spirit::qi; 
    namespace phoenix = boost::phoenix; 

    std::string s("--1234--"); 

    std::string number; 
    bool success = qi::parse(s.begin(), s.end(), 
     qi::lit("--") 
     >> qi::as_string [ +qi::alnum ] [ phoenix::ref(number) = qi::_1 ] 
     >> qi::lit("--")); 
    std::cout << success << " qi::as_string parses: " << number << std::endl; 

    return 0; 
} 
+1

Вы также можете использовать [ 'BOOL успех = й :: синтаксического анализ (ИТЭР, конец, "-" >> + й :: >> цифры, буква "-", номер);'] (HTTP: //melpon.org/wandbox/permlink/gv8seAyNavZoBxua). – llonesmiz

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