2017-02-15 4 views
3

(отказ от ответственности, я учусь подталкивание дух)Попытка разобрать целое число как строку (ци :: as_wstring)

Я пытаюсь разобрать выражение вроде этого: F (1)

и хотите получить 1 как строку («1» вместо числа (которое работает с qi :: int_)).

Я пытался что-то вроде этого (что это неправильно, но, возможно, я нахожусь в правильном направлении), но результирующая строка «\ x1» вместо того, чтобы просто «»

Любое понимание, как для чего нужно разбирать число в строку?

template <typename Iterator> 
struct range_parser : boost::spirit::qi::grammar<Iterator, RangeResult(), iso8859_1::space_type> 
{ 
    range_parser() : range_parser::base_type(start) 
    { 
     using qi::lexeme; 
     using qi::int_; 
     using iso8859_1::digit; 

     number_as_string %= lexeme[ +(int_) ]; 

     start %= 
      qi::lit("F") 
      >> '(' 
      >> number_as_string 
      >> ")" 
      ; 
    } 

    qi::rule<Iterator, std::wstring(), iso8859_1::space_type> number_as_string; 
    qi::rule<Iterator, RangeResult(), iso8859_1::space_type> start; 
}; 
+0

может кто-нибудь изменить название, чтобы удалить часть qi :: as_wstring? он не является релевантным (я думаю) – Max

+4

Я думаю, вы хотели написать '+ (digit)' (одну или несколько цифр) вместо '+ (int_)' (один или несколько целых чисел). Обратите внимание, что он не будет делать то же самое, что и 'int_' (без проверки диапазона, no +/-). Если вы хотите захватить вход, распознанный int_, вы можете попробовать использовать необработанную директиву: 'raw [int_]' http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit /qi/reference/directive/raw.html –

+0

(вернулся к проекту) Привет @BorisGlick, можете ли вы поставить это как ответ, чтобы я мог принять это как ответ? Благодарю. – Max

ответ

1

Я думаю, что вы имели в виду, чтобы написать +(digit) (одна или несколько цифр) вместо +(int_) (одного или нескольких целых чисел). Обратите внимание, что +(digit) не будет делать то же самое, что и qi::int_ (без проверки диапазона, без знака +/-, без ограничения количества цифр, принимающих входов, таких как "000" и т. Д.).

Если вы хотите, чтобы захватить вход признанного qi::int_, вы можете попробовать использовать необработанную директиву: raw[int_]http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit/qi/reference/directive/raw.html

В случае необходимости, можно сохранить как разобранного значения и необработанный ввод qi::int_ парсера , см. здесь: qi::rule with inherited attribute as inherited attribute

+0

Спасибо. Я получил свои простые вещи, но я все еще изучаю парсер. – Max

+0

Добро пожаловать! Я использую его некоторое время, но все же на стадии обучения. –

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