Полностью отнесены парсеры и генераторы в Spirit. Spirit.Qi парсеры всегда экспонируют атрибут, специфичный для их типа. Это называется синтезированным атрибутом , поскольку он возвращается из успешного матча, представляющего согласованную входную последовательность. Например, числовые парсеры, такие как int_
или double_
, возвращают значение int
или double
, преобразованное из согласованной входной последовательности. Другие примитивные парсерные компоненты имеют другие интуитивные типы атрибутов, такие как, например, int_
, который имеет int
, или ascii::char_
, который имеет char
. Для примитивных парсеров применяются обычные правила конвертируемости C++: вы можете использовать любой тип C++ для получения парсированного значения при условии, что тип атрибута парсера конвертируется в предоставленный тип. Следующий пример показывает, как синтезированный атрибут парсера (значение int
) извлекается путем вызова функции API qi::parse
:
int value = 0;
std::string str("123");
std::string::iterator strbegin = str.begin();
qi::parse(strbegin, str.end(), int_, value);
Тип атрибута генератора определяет, какие типы данных этот генератор способен потреблять для того, чтобы производить свой выход. Spirit.Karma Генераторы всегда Ожидают атрибут, специфичный для их типа. Это называется потребляемый атрибут и, как ожидается, будет передан генератору. Потребляемый атрибут - это большую часть времени значение, для которого генератор предназначен для выделения выходной мощности. Для примитивных генераторов применяются обычные правила конвертируемости C++. Любой тип данных, конвертируемый в тип атрибута примитивного генератора, может быть использован для предоставления данных для генерации. Приведем аналогичный пример, приведенный выше, на этот раз потребленный атрибут генератора int_
(значение int
) передается функции API karma::generate
:
int value = 123;
std::string str;
std::back_insert_iterator<std::string> out(str);
karma::generate(out, int_, value);
Другие примитивные компоненты генератора имеют другие интуитивные типы атрибутов, очень похожие на соответствующие компоненты парсера. Например, генератор ascii::char_
имеет char
в качестве потребляемого атрибута. Полный список доступных примитивов парсера и генератора и их типов атрибутов см. в разделах Qi Parsers и Karma Generators.