<qi::phrase_parse>,<qi::phrase_format>теперь пост-скип по умолчанию.
<karma::generate_delimited>и<karma::format_delimited>теперь не делают предварительного разграничения по умолчанию.
Изменилась последовательность параметров<qi::phrase_parse>,<qi::phrase_match>,<karma::generate_delimited>и<match_delimited>. Атрибут теперь всегда последний параметр.
Добавлены новые перегрузки этих функций, позволяющие в явном виде указать постпропускное и предопределяющее поведение.
Добавлены функции многоатрибутного API
Удаленный<grammar_def<>>
Снятые функции<make_parser()>и<make_generator()>
Сняты<qi::none>и<karma::none>
Последовательности и списки теперь принимают стандартный контейнер в качестве своего атрибута.
Терминал для размещения струн теперь может принимать другие струны в качестве своего параметра (т.е. std::string).
Все терминалы, принимающие буквы, теперь принимают (ленивый) функциональный объект.
Все держатели для терминалов и директив (такие как<int_>,<double_>,<verbatim>и т. д.) были ранее определены только в пространстве имен<boost::spirit>. Теперь они дополнительно импортируются в пространства имен<spirit::qi>,<spirit::karma>и<spirit::lex>(если они поддерживаются соответствующей подбиблиотекой).
Терминальные заполнители<char_>и<string>больше не определены в пространстве имен<boost::spirit>, поскольку они были перемещены в пространства имен набора символов, что позволяет выполнять правильную обработку набора символов на основе используемого пространства имен (как<spirit::ascii>и т. Д.)
<uint>,<ushort>,<ulong>и<byte>терминальные держатели были переименованы в<uint_>,<ushort_>,<ulong_>и<byte_>.
<qi::skip[]>теперь включает внешний шкипер, если используется внутри<lexeme[]>
Добавлено<karma::omit[]>, позволяющее потреблять атрибут генератора субъекта без выделения какого-либо выхода (см.<omit>).
Добавлен<karma::buffer[]>, позволяющий избежать нежелательного вывода, который должен быть сгенерирован в случае отказа генератора в середине последовательности (см.<buffer>).
<karma::delimit[]>теперь повторно включает внешний разграничитель, если используется внутри<verbatim[]>
Карма: добавленный и предикат (52) и непредикат (53) Оба теперь всегда потребляют атрибут.
Карма: измененная семантика<char_()>,<string()>,<int_()>и<double_()>: все эти генераторы теперь всегда обнажают атрибут. Если у них нет ассоциированного атрибута, они генерируют свой непосредственный буквальный атрибут. Если они имеют ассоциированный атрибут, генераторы сначала проверяют, равно ли значение атрибута непосредственному буквальному. Они терпят неудачу и не создают ничего, если они не равны. В противном случае они генерируют свои непосредственные буквальные значения. Более подробную информацию см., например,<int_>.
<karma::lit()>теперь может использоваться для генерации целых чисел и чисел с плавающей запятой
<qi::rule>и<karma::rule>теперь могут быть непосредственно инициализированы с помощью их конструктора копий. То есть это работает сейчас:<qi::rule<...>r=...someparser...;>.
<qi::attr()>в качестве его атрибута выставляется его непосредственный параметр.
Добавлены булевы парсеры и генераторы<bool_>,<true_>,<false_>.
Добавлено<attr_cast<>>, что позволяет в грамматике ци и кармы преобразовывать тип атрибута.
Почти все генераторы кармы теперь принимают атрибуты<optional<>>и не смогут генерировать, если это не будет инициализировано.
Правила ци и кармы теперь автоматически определяют, применять ли семантику автоматического управления или нет (больше не нужно использовать<operator%=()>, даже если она все еще существует). Семантика автоматического управления применяется, если правая сторона не имеет семантических действий, прикрепленных к любому из элементов. Это работает для инициализации правил и назначения.
Правила ци и кармы теперь делают внутреннее преобразование атрибутов, основанное на точке настройки атрибутов<traits::transform_attribute>.
Все char_ parsers теперь всегда выставляют атрибут.<char_(...)>ранее не разоблачали атрибута<char_>. Если вам нужен буквальный парсер, не обнажающий никаких атрибутов<lit(...)>.
Типы qi::int_spec, qi::real_spec, Karma::int_spec и Karma real_spec больше не существуют. Они были заменены на qi::int_parser, qi::real_parser, Karma::int_generator и Karma::real_generator.
Вот список изменений вSpirit.Lexс версии 2.0.Spirit.Lex2.1 является полным переписываниемSpirit.Lexраспространяется с Boost V1.37. Как и все кодовые части библиотекиSpirit,Spirit.Lexможно использовать как самостоятельную часть.Spirit.Lexтеперь использует инфраструктуру, предоставленнуюSpiritверсии 2.1.
Класс lex::lexer_def был переименован в lex::lexer, в то время как оригинальный класс lex::lexer больше не существует. Это упрощает создание лексеров.
Класс lexer::lexer больше не имеет функции<def(Self&self)>, определения токенов могут быть добавлены к лексеру в любое время, обычно в конструкторе определяемого пользователем класса лексера:<
template<typenameLexer>structexample_tokens:lex::lexer<Lexer>{example_tokens(){// your token definitions herethis->self=...}};
>
Новый класс лексеров теперь можно использовать напрямую. Функция<make_lexer()>была удалена.
Функции<lex::tokenize_and_parse()>и<lex::tokenize_and_phrase_parse()>были изменены, чтобы соответствовать последовательности параметров, реализованной функциями<qi::parse()>и<qi::phrase_parse()>. Оба принимают произвольное число аргументов атрибутов в качестве последних параметров. Этот список аргументов ограничен макросом<SPIRIT_ARGUMENTS_LIMIT>.
<lex::lexertl_lexer>и<lex::lexertl_token>классы были перемещены в<lex::lexertl>пространство имен, и имена были изменены на<lex::lexertl::lexer>,<lex::lexertl::token>. Это относится и к<lex::lexert_actor_lexer>, и к<static_lexertl_*>семейству типов.
Класс<lex::lexertl_token_set>был удален. Эта функция теперь доступна в классе lexer.
БиблиотекаSpirit.Lexбыла обновлена для использования новейшей версии библиотеки строительства лексеров Ben HansonsLexertl(обзор проекта находится на рассмотрении).
Конструктор шаблонов<lex::lexer<Lexer>>теперь использует дополнительный параметр, определяющий<match_flags>, который будет использоваться для генерации таблиц. В настоящее время доступны следующие флаги:<
match_flags::match_default,// no flagsmatch_flags::match_not_dot_newline,// the regex '.' doesn't match newlinesmatch_flags::match_icase// all matching operations are case insensitive
>Если конструктору не передается параметр, используется<match_flags::match_default>, т.е.<.>соответствует новым линиям и соответствие чувствительно к регистру.
Заполнители<char_()>и<string()>теперь могут использоваться для определения токенов и являются синонимами<token_def>.
Семантические действия Лексера теперь должны соответствовать измененному интерфейсу (подробнее см.Семантические действия Лексера).
Добавлены символы заполнителя, используемые изнутри семантических действий лексера при использовании Феникса:<lex::_start>,<lex::_end>,<lex::_eoi>,<lex::_state>,<lex::_val>и<lex::_pass>(подробнее см.Семантические действия Лексера).
Добавлены (ленивые) вспомогательные функции, используемые изнутри лексических семантических действий при использовании Феникса:<lex::more()>,<lex::less()>и<lex::lookahead()>(подробнее см.Лексерские семантические действия).
Удален<lex::omitted>в пользу<lex::omit>для унификации общего интерфейса.
Статья Spirit V2.1 раздела Spirit 2.5.2 What's New может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.