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

Character Generators (char_, lit)

Boost , Spirit 2.5.2 , Char Generators

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

Генераторы символов, описанные в этом разделе:

Генератор<char_>излучает одиночные символы.<char_>Генератор имеет ассоциированныйКодирование символов пространства имен. Это необходимо при выполнении основных операций, таких как принуждение нижнего или верхнего корпуса и работа с диапазонами символов.

Существуют различные формы<char_>.

char_

В<char_>-й главе нет ни одного из них.Кодирование символов пространства имен.

char_               // emits any character as supplied by the attribute
char_(ch)

Единая форма аргумента<char_>(с аргументом символа) излучает предоставленный характер.

char_('x')          // emits 'x'
char_(L'x')         // emits L'x'
char_(x)            // emits x (a char)
char_(first, last)

<char_>с двумя аргументами, излучает любой символ из ряда символов, поставляемых атрибутом.

char_('a','z')      // alphabetic characters
char_(L'0',L'9')    // digits

Ряд символов создается из низко-высокой пары символов. Такой генератор излучает один символ, находящийся в диапазоне, включая обе конечные точки. Обратите внимание, что первый символ должен бытьдовторого, согласно базовомуПространству имен символов.

Картирование символов по своей сути зависит от платформы. Например, в стандарте не гарантируется, что<'A' <'Z'>, поэтому в Spirit2 мы специально прикрепляем к генератору<char_>специальноепространство имен для кодирования символов(например, ASCII, ISO-8859-1) для устранения таких неясностей.

[Note]Note

Разрозненные битовые векторы

Для размещения 16/32 и 64-битных символов char-set статически переключается с реализации<std::bitset>, когда тип символа не превышает 8 бит, на разреженный бит/булевый набор, который использует сортированный вектор разъединенных диапазонов<range_run>. Набор построен из таких диапазонов, что смежные или перекрывающиеся диапазоны сливаются.

<range_runs>очень экономичны в ситуациях, когда существует множество диапазонов и несколько отдельных разрозненных значений. Поиск - это O(log n), где n - число диапазонов.

char_(def)

Наконец, при заданной строке (простой строке C,<std::basic_string>и т. Д.), Струна рассматривается как строка определения char-set после синтаксиса, который напоминает наборы символов с регулярным выражением в стиле posix (за исключением того, что двойные цитаты ограничивают элементы набора вместо квадратных скобок и нет специального отрицания ^ символа). Примеры:

char_("a-zA-Z")     // alphabetic characters
char_("0-9a-fA-F")  // hexadecimal characters
char_("actgACTG")   // DNA identifiers
char_("\x7f\x7e")   // Hexadecimal 0x7F and 0x7E

Эти генераторы испускают любой символ из ряда символов, поставляемых атрибутом.

lit(ch)

<lit>Когда проходит один символ, ведет себя как один аргумент<char_>, за исключением того, что<lit>не потребляет атрибут.<char>или<wchar_t>является эквивалентом<lit>.

[Note]Note

<lit>повторно используется генераторамиструн, генераторами char и генераторами числа (см.подписанное целое число,неподписанное целое числоигенераторы реального числа). В общем, генератор char создается, когда вы проходите в символе, генератор струн создается, когда вы проходите в строке, а генератор цифр создается, когда вы используете буквальный номер. Исключением является прохождение одной буквальной строки элемента, например<lit("x")>. В этом случае мы оптимизируем это, чтобы создать генератор char вместо генератора струн.

Примеры:

'x'
lit('x')
lit(L'x')
lit(c)      // c is a char
Header
// forwards to <boost/spirit/home/karma/char/char.hpp>
#include <boost/spirit/include/karma_char_.hpp>

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

Namespace

Имя

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

ns::char_

В приведенной выше таблице<ns>представленоПространство имен символов.

Model of

Notation

ch, ch1, ch2

Специфический характер класса персонажа (см. Типы классов персонажа) или ленивый аргумент, который оценивает значение конкретного персонажа класса персонажа

cs

Строка спецификатора набора символов (см. Типы классов символов) или ленивый аргумент, который оценивает строку спецификатора набора символов или указатель / ссылка на нулевой массив символов. Эта строка определяет строку определения шара, следуя синтаксису, который напоминает наборы символов регулярного выражения в стиле posix (кроме квадратных скобок и символа отрицания<^>).

ns

Кодирование пространства имен.

cg

Генератор char, генератор char range или генератор char set.

Expression Semantics

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

выражение

Описание

ch

Создайте буквальный символ<ch>. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

<lit(ch)>

Создайте буквальный символ<ch>. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

ns::char_

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

ns::char_(ch)

ns::char_("c")

Создайте символ<c>, как это предусмотрено непосредственным буквальным значением, из которого инициализируется генератор. Если этот генератор имеет ассоциированный атрибут, он преуспевает только до тех пор, пока атрибут равен непосредственному буквальному (если основной выходной поток не сообщает об ошибке). В противном случае этот генератор выходит из строя и не генерирует никакого вывода.

ns::char_(ch1, ch2)

ns::char_(cs)

Создайте символ, предоставленный обязательным атрибутом, интерпретируемым в наборе символов, определенном<ns>. Генератор работает до тех пор, пока атрибут принадлежит набору символов<cs>(если основной выходной поток не сообщает об ошибке). В противном случае этот генератор выходит из строя и не генерирует никакого вывода.

~cg

Негат<cg>. Результатом является генератор с отрицательным зарядом, который инвертирует тестовое состояние генератора символов, к которому он прикреплен.

Предполагается, что символ<ch>относится к диапазону символов, определенному<ns::char_(ch1,ch2)>, если его значение символа (двоичное представление), интерпретируемое в наборе символов, определенном<ns>, не меньше значения символа<ch1>и не больше, чем значение символа<ch2>(т.е.<ch1<= ch<= ch2>).

Параметр<charset>, переданный<ns::char_(charset)>, должен быть строкой, содержащей более одного символа. Предполагается, что каждый отдельный символ в этой строке принадлежит набору символов, определенному этим выражением. Исключением из этого является<'-'>символ, который имеет особое значение, если он не указан как первый и не последний символ в<charset>. Если<'-'>используется между символами, он интерпретируется как охватывающий диапазон символов. Символ<ch>считается принадлежащим к определенному набору символов<charset>, если он соответствует одному из символов, как указано параметром строки, описанным выше. Например,

Пример

Описание

char_("abc")

'a', 'b' и 'c'

char_("a-z")

<char_("a-zA-Z")>

char_("-1-9")

Attributes

выражение

атрибут

ch

<unused>

<lit(ch)>

<unused>

ns::char_

Ch, атрибут является обязательным (в противном случае компиляция потерпит неудачу). Ch - это тип персонажа Character Encoding Namespace, ns.

ns::char_(ch)

<Ch>, атрибут является необязательным, если он поставляется, генератор сравнивает атрибут с<ch>и преуспевает только в том случае, если оба равны, в противном случае.<Ch>- тип символаПространство имен символов,<ns>.

ns::char_("c")

Ch, атрибут является необязательным, если он поставляется, генератор сравнивает атрибуты c и успех только в том случае, если оба равны, в противном случае. Ch - это тип персонажа Character Encoding Namespace, ns.

ns::char_(ch1, ch2)

Ch, атрибут является обязательным (в противном случае компиляция потерпит неудачу), генератор преуспевает, если атрибут относится к диапазону символов [ch1, ch2], интерпретируемому в символе ns. Ch - это персонаж Тип Character Encoding Namespace, ns.

ns::char_(cs)

Ch, атрибут является обязательным (в противном случае компиляция потерпит неудачу), генератор преуспевает, если атрибут относится к набору символов cs, интерпретируется в символе ns. Ch - это персонаж Тип Character Encoding Namespace, ns.

~cg

[Note]Note

В дополнение к их обычному атрибуту типа<Ch>все перечисленные генераторы также принимают экземпляр<boost::optional<Ch>>. Если<boost::optional<>>инициализирован (имеет значение), генераторы ведут себя так, как если бы их атрибут был экземпляром<Ch>и испускают значение, сохраненное в<boost::optional<>>. В противном случае генераторы не сработают.

Complexity

O(1)

Сложность<ch>,<lit(ch)>,<ns::char_>,<ns::char_(ch)>и<ns::char_("c")>постоянна, так как все генераторы излучают ровно один символ на вызов.

Генератор диапазона символов<ns::char_(ch1,ch2)>дополнительно требует постоянного времени поиска для проверки того, принадлежит ли атрибут диапазону символов.

Генератор набора символов (<ns::char_(cs)>) дополнительно требует времени поиска O(log 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::lit;
using boost::spirit::ascii::char_;

Использование генераторов<char_>:

test_generator("A", 'A');
test_generator("A", lit('A'));
test_generator_attr("a", char_, 'a');
test_generator("A", char_('A'));
test_generator_attr("A", char_('A'), 'A');
test_generator_attr("", char_('A'), 'B');         // fails (as 'A' != 'B')
test_generator_attr("A", char_('A', 'Z'), 'A');
test_generator_attr("", char_('A', 'Z'), 'a');    // fails (as 'a' does not belong to 'A'...'Z')
test_generator_attr("k", char_("a-z0-9"), 'k');
test_generator_attr("", char_("a-z0-9"), 'A');    // fails (as 'A' does not belong to "a-z0-9")


PrevUpHomeNext

Статья Character Generators (char_, lit) раздела Spirit 2.5.2 Char Generators может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Char Generators ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 01:58:08/0.0071330070495605/0