Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Repetition Generator Directive (repeat[])

Boost , Spirit 2.5.2 , Generator Directives

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
Description

Директива повторения позволяет повторять произвольную экспрессию генератора, опционально определяя количество повторений в нижней и верхней частях. Он обеспечивает более мощный и гибкий механизм для повторения генератора. Существуют грамматики, которые непрактичны и громоздки, если не невозможны, для базового синтаксиса итерации EBNF (унарный<'*'>иунарный<'+'>). Примеры:

  • Имя файла может иметь максимум 255 символов.
  • Конкретный формат растровых файлов имеет ровно 4096 RGB цветовой информации.
  • 256-битная двоичная строка (1..256 1s или 0s).
Header
// forwards to <boost/spirit/home/karma/directive/repeat.hpp>
#include <boost/spirit/include/karma_repeat.hpp>

См. такжеВключить структуру.

Namespace

Имя

<boost::spirit::repeat// alias: boost::spirit::karma::repeat>

<boost::spirit::inf// alias: boost::spirit::karma::inf>

Model of

Notation

a

Объект генератора

num, num1, num2

Числовые буквы, любое неподписанное целое число или ленивый аргумент, который оценивает неподписанное целое число

inf

Выражение, обозначающее «нет верхнего предела повторения» "

Expression Semantics

Семантика выражения определяется только там, где она отличается от или не определена в<UnaryGenerator>.

выражение

Семантика

<repeat[a]>

Повторить генератор<a>ноль или более раз. Этот генератор работает до тех пор, пока его встроенный генератор<a>не выходит из строя (за исключением случаев, когда основной выходной поток сообщает об ошибке). Этот вариант<repeat[]>семантически эквивалентен. Оператор Kleene Star<*a>

<repeat(num)[a]>

Повторите генератор<a>ровно<num>раз. Этот генератор работает до тех пор, пока его встроенный генератор<a>не выходит из строя и пока связанный атрибут (контейнер) содержит по меньшей мере<num>элементов (если основной выходной поток не сообщает об ошибке).

<repeat(num1, num2)[a]>

Повторите генератор<a>по меньшей мере<num1>раз, но не более<num2>раз. Этот генератор работает до тех пор, пока его встроенный генератор<a>не выходит из строя и до тех пор, пока связанный атрибут (контейнер) содержит по меньшей мере<num1>элементов (если основной выходной поток не сообщает об ошибке). Если ассоциированный атрибут (контейнер) содержит более 47 элементов, эта директива ограничивает количество повторов до 47.

<repeat(num, inf)[a]>

Повторите генератор<a>по меньшей мере<num1>раз. Верхний предел для повторного подсчета не установлен. Этот генератор работает до тех пор, пока его встроенный генератор<a>не выходит из строя и пока связанный атрибут (контейнер) содержит по меньшей мере<num>элементов (если основной выходной поток не сообщает об ошибке).

[Note]Note

Все неисправные итерации встроенного генератора будут потреблять один элемент из поставляемого атрибута. Общий<repeat[a]>будет успешным, пока выполняются критерии итерации (количество успешных вызовов встроенного генератора) (если основной выходной поток не сообщает об ошибке).

Attributes

См.Составные обозначения атрибутов.

выражение

атрибут

<repeat[a]>

<
a:A-->repeat[a]:vector<A>
a:Unused-->repeat[a]:Unused
>

<repeat(num)[a]>

a: A --> repeat(num)[a]: vector<A>
a: Unused --> repeat(num)[a]: Unused

<repeat(num1, num2)[a]>

a: A --> repeat(num1, num2)[a]: vector<A>
a: Unused --> repeat(num1, num2)[a]: Unused

<repeat(num, inf)[a]>

a: A --> repeat(num, inf)[a]: vector<A>
a: Unused --> repeat(num, inf)[a]: Unused

[Important]Important

В таблице выше используется<vector<A>>только в качестве заполнителей.

<vector<A>>означаетлюбой контейнер STL, содержащий элементы типа<A>.

Важно отметить, что директива<repeat[]>не выполняет буферизации вывода, генерируемого встроенными элементами. Это означает, что любой неисправный генератор элементов может уже генерировать некоторый выход, которыйнеоткатился назад.

[Tip]Tip

Самый простой способ заставить директиву<repeat[]>вести себя так, как будто она буферизует, — это завернуть ее в буферную директиву (см.<buffer>):

buffer[repeat[a]]

негенерирует выход в случае выхода из строя генератора<repeat[a]>. Выражение:

repeat[buffer[a]]

Он не будет генерировать частичный выход из генератора<a>, если он не генерирует в середине своего выхода. Общее выражение все равно будет генерировать выход, произведенный всеми последующими вызовами генератора<a>.

Complexity

Общая сложность генератора повторения определяется сложностью его встроенного генератора. Сложность самого повтора - O(N), где N - число повторений для выполнения.

Example
[Note]Note

Испытательный ремень для примера (примеров) ниже представлен в разделеОсновные примеры.

Некоторые включают:

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <iostream>
#include <string>

Некоторые используют декларации:

using boost::spirit::karma::double_;
using boost::spirit::karma::repeat;

Основное использование директивы генератора<repeat>:

std::vector<double> v;
v.push_back(1.0);
v.push_back(2.0);
v.push_back(3.0);
test_generator_attr("[1.0][2.0][3.0]", repeat['[' << double_ << ']'], v);
test_generator_attr("[1.0][2.0]", repeat(2)['[' << double_ << ']'], v);
// fails because of insufficient number of items
test_generator_attr("", repeat(4)['[' << double_ << ']'], v);


PrevUpHomeNext

Статья Repetition Generator Directive (repeat[]) раздела Spirit 2.5.2 Generator Directives может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Generator Directives ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:24:56/0.0098578929901123/1