![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Repetition Parser Directive (repeat[])Boost , Spirit 2.5.2 , Parser Directives
|
Имя |
---|
< |
< |
Notation
a
n
, min
, max
<int
>Все, что может быть преобразовано в<int
>, илиЛенивый Аргумент, который оценивает все, что может быть преобразовано в<int
>.
Семантика выражения определяется только там, где она отличается от или не определена в<UnaryParser
>.
выражение |
Семантика |
---|---|
< | Повторить< |
< | Повторить< |
< | Повторить< |
< | Повторить< |
См.Составные обозначения атрибутов.
выражение |
атрибут |
---|---|
< |
a: A --> repeat[a]: vector<A> a: Unused --> repeat[a]: Unused
|
< | <a:A-->repeat(n)[a]:vector<A> a:Unused-->repeat(n)[a]:Unused> |
< | <a:A-->repeat(min,max)[a]:vector<A> a:Unused-->repeat(min,max)[a]:Unused> |
< | <a:A-->repeat(min,inf)[a]:vector<A> a:Unused-->repeat(min,inf)[a]:Unused> |
Общая сложность определяется сложностью его предметного парсера. Сама сложность<
repeat
>является O(N), где N — число повторений для выполнения.
![]() | 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 могут быть динамическими. Рассмотрим разбор двоичного файла префиксированной строки в стиле Паскаля, где первый байт определяет длину входящей строки. Вот образец ввода:
Этот тривиальный пример не может быть практически определен в традиционном 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"
Статья Repetition Parser Directive (repeat[]) раздела Spirit 2.5.2 Parser Directives может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Parser Directives ::
реклама |