Эта версия Spirit теперь поддерживает новую версию Boost.Phoenix (V3), которая была выпущена как часть Boost V1.47. Обратите внимание, что эта поддержка носит чисто предварительный характер и не должна считаться качеством продукции. Причина, по которой мы выпускаем это сейчас, заключается в том, чтобы позволить людям, которые хотят использовать новую версию Boost.Phoenix в своем коде, сделать это без каких-либо конфликтов с существующим кодом, используя Spirit. Вообще нет Спирит код должен быть изменен. Чтобы активировать использование Boost.Phoenix V3 для Spirit, необходимо определить следующую константу препроцессора для ваших сборок (до включения любого из файлов Spirit):
Добавлено utree, общая, иерархическая и динамическая структура данных, которая может представлять абстрактные синтаксические деревья. Он хорошо интегрирован с Spirit.Qi и Spirit.Karma. Он может быть передан как атрибут, в то время как сводится к почти любой грамматике. В то же время, он может быть использован в качестве атрибута для генерации вывода из.
Добавлен новый макрос BOOST_SPIRIT_TERMINAL_NAME, который принимает два параметра (имя терминала и его тип). Раньше был только один параметр (имя терминала), и тип предполагал название терминала с приложением _type. Это привело к появлению неправильных идентификаторов C++ с такими терминалами, как int_, что привело к появлению типа int__type с фиктивным двойным подчеркиванием, которое предназначено для системного использования на C++.
Числовые парсеры теперь допускают произвольный радикс от 2..10 и 16
Заместитель _val теперь может быть использован в семантических действиях верхнего уровня за пределами любой правой стороны правила. >>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> В этом случае _val относится к значению атрибута, которое передается в parse() или phrase_parse() функции. Схожие конструкции теперь возможны в Spirit.Karma, а также:
inti=123;BOOST_TEST(test("
>>>.
Добавлена поддержка для Spirit.Karma неподписанных числовых генераторов с произвольными значениями излучения в (включительно) диапазоне от 2.. 36.
Spirit.Qi целых литералов (например, int_(10)) больше не потребляет ввод на сбои.
#5246: mmap_file_iterator Не удается правильно инициализировать.
#5246: mmap_file_iterator Не удается правильно инициализировать.
Исправлена проблема с правильностью константа в karma::real_policies<>, препятствующая использованию типов конструкций с генератором. Спасибо Йерон Хабракен (a.k.a. VeXocide) за сообщение и за представление патча и теста.
Исправлено Spirit.Qiattr(attrib) parser, Spirit.Qisymbols< parser, и Spirit.Karma Они были сломаны в Boost V1.46.1 (благодарит Аарона Грэма и Джорга Бекера за сообщение о проблемах).
Исправлен stream parser, чтобы правильно настроить итератор основного потока ввода в случае, когда компонент потокового парсера был успешным. Спасибо Брайану О'Кеннеди, который сообщил о проблеме на Stackoverflow.
Исправленные неисправные генераторы цифр Кармы при использовании с адаптированными ADTs (благодаря Колину Рундел за сообщение этой проблемы).
Spirit.Qi директива repeat ошибочно реализованная семантика фиксации/закаталки для своего атрибута, оставляя ее нетронутой, если директива провалилась. Это поведение было устранено, поскольку оно несовместимо с аналогичными компонентами. Существующий код, опирающийся на эту функциональность, будет ломаться. Пожалуйста, обратитесь к директиве Spirit.Qihold, чтобы посмотреть, как исправить ваш код.
Добавлено предпроцессорное определение BOOST_SPIRIT_NO_PREDEFINED_TERMINALS для предотвращения мгновенных сообщений предопределенных конечных объектов, которые замедляют время компиляции. Когда BOOST_SPIRIT_NO_PREDEFINED_TERMINALS определено, пользователь моментирует терминалы, которые ему нужны. Так, вместо того, чтобы писать , используяqi::uint_ вместо этого пишет: qi::uint_typeuint_.
Добавлена возможность указать токен id при создании токен определения с использованием lex::char_ и lex::string. Оба примитива теперь принимают второй параметр, который будет интерпретирован как запрошенный токен id для любого токена, полученного из этого определения.
Добавлен новый токен типа lex::lexertl::position_token<>, который по существу plup-in совместим с существующим lex::lexertl::token<> класс. Тем не менее, он дополнительно сохраняет пару итераторов, указывающих на лежащую в основе последовательность ввода как итератор_диапазон.
Исправлена проблема с связыванием токеновых определений со всеми состояниями (используя "*" как название государства), когда к ним прилагались действия.
Тип hold_any в настоящее время принимает аргумент шаблона: basic_hold_any<Char>, где Char является типом символов, используемым для потоковых операторов (оператор>() и оператор<<)>>>>. hold_any все еще доступен как typedefbasic_hold_any<char>hold_any;
Семантические действия теперь поддерживают совместимость атрибутов. #define BOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT должны быть определены для того, чтобы новое поведение началось. По умолчанию старое поведение все еще на месте.
Теперь альтернативы поддерживают совместимость атрибутов.
Обработка атрибутов для контейнерных атрибутов последовательностей и контейнерных компонентов (список, Kleene, Plus и повторяющийся) была полностью переписана. Теперь он поддерживает гораздо больше случаев использования и ведет себя гораздо более предсказуемо, чем более старая версия. Спасибо Томасу Тейлору, Ричарду Кроссли, Семену, Адалберто Кастело и многим другим за сообщение о ошибках и помощь в создании нового кода вести себя так, как ожидалось.
Статья Spirit V2.5 раздела Spirit 2.5.2 What's New может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.