2016-07-24 2 views
1

Я хотел бы анализировать различные числа с помощью духа x3 в строку. Я попытался сделать это так, но это не сработает.Разбор номера в строку с повышающим духом x3

typedef x3::rule<class int_parser_id, std::string> int_parser_type; 
const int_parser_type int_parser = "int_parser"; 
auto const int_parser_def = x3::int32; 

Что я могу сделать, чтобы разобрать Int с помощью синтаксического анализатора x3 :: int32 в строку?

+2

Говорить, что «это не работает» не говорит нам ничего, что может вам помочь. Пожалуйста, опишите ***, как *** «это не работает». Вы получаете ошибки сборки? Сбой во время выполнения? Неверные результаты? Чем больше деталей, тем лучше. Если вы получаете ошибки сборки, вы должны скопировать все ошибки (полностью и полностью) * как текст * неотредактированный в тело вопроса. Если вы получите неожиданные результаты, сообщите нам свой ввод и фактический * и ожидаемый * вывод. Если вы получаете сбои, запустите в отладчике, чтобы найти сбой. Также, пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). –

+0

@JoachimPileborg: В этом случае он не работает так же, как мой автомобиль не плавает - библиотека просто не _for_. Но если бы ФП знал об этом, они бы не спрашивали этот quesiton в первую очередь ...; -] – ildjarn

+2

Этот анализатор должен анализировать последовательность чисел в строку: std :: string input = "1234"; std :: string out; x3 :: phrase_parse (input.begin(), input.end(), + x3 :: digit, x3 :: space, out); assert (out == input); (что означает 1 или более цифр. Атрибут «digit» parser - это «char», поэтому, когда вы ставите плюс спереди, вы получаете вектор char или string). – matiu

ответ

1

Анализ анализирует строку для создания объектов конкретного типа или набора типов; то, о чем вы просите, противоположно тому, что Дух называет «поколением». Spirit.X3 выполняет синтаксический анализ, поэтому ответ на ваш прямой вопрос: вы не можете.

Однако, Spirit действительно поставляется с отдельным компонентом для генерации: Spirit.Karma.

namespace karma = boost::spirit::karma; 

int const i = /*...*/; 
std::string str; 
karma::generate(std::back_inserter(str), karma::int_, i); 

Online Demo

Следует отметить, что карма кодовая С ++ 03, и, следовательно, имеет значительно более длительное время компиляции, чем Х3 - использование скомпилированных заголовков настоятельно рекомендуется!

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