![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Stream Parsers (stream, wstream, etc.)Boost , Spirit 2.5.2 , Stream Parsers
|
Имя |
---|
< |
< |
template <typename Char, typename Attrib> struct stream_parser;
Параметр |
Описание |
по умолчанию |
---|---|---|
< | Тип символа, используемый для генерации ввода. Этот тип будет использоваться при назначении генерируемых символов базовому итератору ввода. | < |
< | Тип атрибута< | < |
Notation
s
Переменный экземпляр любого типа с заданной соответствующей потоковой передачей<operator>>()
>илиЛенивым аргументом, который оценивает любой тип с заданной соответствующей потоковой передачей<operator>>()
>.
Семантика выражения определяется только там, где она отличается от или не определена в<PrimitiveParser
>.
выражение |
Описание |
---|---|
< | Позвоните в стриминг< |
< | Позвоните в стриминг< |
Все парсеры, перечисленные в таблице выше, являются предварительно определенными специализациями<stream_parser<Char>
>основного типа парсера потока, описанного ниже. Можно напрямую использовать этот тип для создания потоковых парсеров с использованием произвольного базового типа символов.
выражение |
Семантика |
---|---|
<stream_parser< Char,Attrib >()> | Позвоните в стриминг< |
Все перечисленные выше парсеры потоков требуют, чтобы тип значения для разбора (связанный атрибут) реализовывал оператор потоков, соответствующий обычным конвенциям потоков ввода-вывода (где<attribute_type
>является типом значения для распознавания при разборе):
template <typename Istream> Istream& operator>> (Istream& os, attribute_type& attr) { // type specific input parsing return os; }
Этот оператор будет вызван парсерами потока для сбора входных данных для атрибута типа<attribute_type
>.
![]() | Note |
---|---|
Если парсер< |
выражение |
атрибут |
---|---|
< | < |
< | < |
< | < |
![]() | Important |
---|---|
Тип атрибута< |
O(N), где N - количество символов, потребляемых парсером потока
![]() | Note |
---|---|
Тестовый ремень для примера (примеров) ниже представлен в разделеОсновные примеры. |
Определение класса, используемое в примерах:
// a simple complex number representation z = a + bi struct complex { complex (double a = 0.0, double b = 0.0) : a(a), b(b) {} double a; double b; };
// define streaming operator for the type complex std::istream& operator>> (std::istream& is, complex& z) { char lbrace = '\0', comma = '\0', rbrace = '\0'; is >> lbrace >> z.a >> comma >> z.b >> rbrace; if (lbrace != '{' || comma != ',' || rbrace != '}') is.setstate(std::ios_base::failbit); return is; }
Использование деклараций и переменных:
using boost::spirit::qi::stream; using boost::spirit::qi::stream_parser;
Простая строка с использованием оператора>>(istream&, std::string&);
std::string str; test_parser_attr("abc", stream, str); std::cout << str << std::endl; // prints: abc
Проанализируйте наш сложный тип с помощью оператора>>(istream&, complex&);
complex c; test_parser_attr("{1.0,2.5}", stream_parser<char, complex>(), c); std::cout << c.a << "," << c.b << std::endl; // prints: 1.0,2.5
Статья Stream Parsers (stream, wstream, etc.) раздела Spirit 2.5.2 Stream Parsers может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Stream Parsers ::
реклама |