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

Repetition Parser Directive (repeat[])

Boost , Spirit 2.5.2 , Parser 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

<repeat[]>обеспечивает более мощный и гибкий механизм для повторения парсера. Существуют грамматики, которые непрактичны и громоздки, если не невозможно, для базового синтаксиса итерации EBNF (KleeneиPlus). Примеры:

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

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

Namespace

Имя

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

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

Model of

Notation

a

<Parser>.

n, min, max

<int>Все, что может быть преобразовано в<int>, илиЛенивый Аргумент, который оценивает все, что может быть преобразовано в<int>.

Expression Semantics

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

выражение

Семантика

<repeat[a]>

Повторить<a>ноль или более раз. Так же, какКлин

.

<repeat(n)[a]>

Повторить<a>точно<n>раз.

<repeat(min, max)[a]>

Повторить<a>не менее<min>раз и не более<max>раз.

<repeat(min, inf)[a]>

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

Attributes

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

выражение

атрибут

<repeat[a]>

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

<repeat(n)[a]>

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

<repeat(min, max)[a]>

<
a:A-->repeat(min,max)[a]:vector<A>
a:Unused-->repeat(min,max)[a]:Unused
>

<repeat(min, inf)[a]>

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

Complexity

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

Example
[Note]Note

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

Используя директиву повторения, мы можем привести примеры выше.

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

using boost::spirit::qi::repeat;
using boost::spirit::qi::lit;
using boost::spirit::qi::uint_parser;
using boost::spirit::qi::_1;
using boost::spirit::ascii::char_;
namespace phx = boost::phoenix;

Парсер для имени файла с максимум 255 символами:

test_parser("batman.jpeg", repeat(1, 255)[char_("a-zA-Z_./")]);

Парсер для конкретного формата растровых файлов, который имеет ровно 4096 RGB цветовой информации. (Для этого примера мы будем тестировать только 3 RGB цветовую информацию.)

uint_parser<unsigned, 16, 6, 6> rgb;
std::vector<unsigned> colors;
test_parser_attr("ffffff0000003f3f3f", repeat(3)[rgb], colors);
std::cout
    << std::hex
    << colors[0] << ','
    << colors[1] << ','
    << colors[2] << std::endl;

256-битная двоичная строка (1..256 1s или 0s). (В этом примере мы будем тестировать только 16 бит.)

test_parser("1011101011110010", repeat(16)[lit('1') | '0']);

Парсеры Loop могут быть динамическими. Рассмотрим разбор двоичного файла префиксированной строки в стиле Паскаля, где первый байт определяет длину входящей строки. Вот образец ввода:

pascal_string

Этот тривиальный пример не может быть практически определен в традиционном EBNF. Хотя некоторые варианты EBNF позволяют создавать более мощные конструкции повторения, чем Kleene Star, мы все еще ограничены разбором фиксированных струн. Природа EBNF заставляет коэффициент повторения быть постоянным. С другой стороны, Spirit позволяет изменять коэффициент повторения во время выполнения. Мы могли бы написать грамматику, которая принимает входную строку выше. Пример использования феникса:

std::string str;
int n;
test_parser_attr("\x0bHello World",
    char_[phx::ref(n) = _1] >> repeat(phx::ref(n))[char_], str);
std::cout << n << ',' << str << std::endl;  // will print "11,Hello World"


PrevUpHomeNext

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:35:13/0.0075500011444092/0