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

Alternative Parser (a | b)

Boost , Spirit 2.5.2 , Parser Operators

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

Альтернативный оператор<a |b>соответствует одному из двух или более операндов (<a>,<b>, ... и т.д.):

a | b | ...

Альтернативные операнды испытываются один за другим на основе выигрышей первого матча, начиная с самого левого операнда. После того, как найдена успешно подобранная альтернатива, парсер завершает поиск, по существу, замыкая поиск других потенциально жизнеспособных кандидатов. Это короткое замыкание косвенно придает наивысший приоритет самой левой альтернативе.

Короткое замыкание выполняется так же, как и логические выражения C или C++; например,<if(x<3||y <2)>, где, если<x <3>, тест<y< 2>не выполняется вообще. В дополнение к предоставлению имплицитного правила приоритета для альтернатив, которое необходимо, учитывая его недетерминированный характер, короткое замыкание увеличивает время выполнения. Если порядок ваших альтернатив логически неуместен, стремитесь поставить наиболее распространенный выбор на первое место для максимальной эффективности.

Header
// forwards to <boost/spirit/home/qi/operator/alternative.hpp>
#include <boost/spirit/include/qi_alternative.hpp>

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

Model of

Notation

a, b

<Parser>

Expression Semantics

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

выражение

Семантика

<a| b>

Матч<a>или<b>

.
Attributes

См.Составные обозначения атрибутов.

выражение

атрибут

<a| b>

<
a:A,b:B-->(a|b):variant<A,B>
a:A,b:Unused-->(a|b):optional<A>
a:A,b:B,c:Unused-->(a|b|c):optional<variant<A,B>>
a:Unused,b:B-->(a|b):optional<B>
a:Unused,b:Unused-->(a|b):Unused
a:A,b:A-->(a|b):A
>

[Note]Note

Альтернативные парсеры не откатывают изменения, внесенные во внешний атрибут из-за неудачной альтернативы. Если вам нужно обеспечить, чтобы только последующая альтернатива изменила внешний атрибут, пожалуйста, используйте директиву<hold><[]>.

Complexity

Общая сложность альтернативного парсера определяется суммой сложностей его элементов. Сложность самого альтернативного парсера — O(N), где N — число альтернатив.

Example
[Note]Note

Тестовый ремень для примера (примеров) ниже представлен в разделеОсновные примеры.

Некоторые используют декларации:

using boost::spirit::ascii::string;
using boost::spirit::qi::int_;
using boost::spirit::qi::_1;
using boost::variant;

Простое использование:

test_parser("Hello", string("Hello") | int_);
test_parser("123", string("Hello") | int_);

Извлекая вариант атрибута (используяBoost.Variant):

variant<std::string, int> attr;
test_parser_attr("Hello", string("Hello") | int_, attr);

Это должно быть напечатано<"Hello">. Примечание: Есть лучшие способы извлечь ценность из варианта. См.Boost.Variantvisitation. Этот код предназначен исключительно для демонстрации.

if (boost::get<int>(&attr))
    std::cout << boost::get<int>(attr) << std::endl;
else
    std::cout << boost::get<std::string>(attr) << std::endl;

Извлечение атрибутов с помощью семантических действий с помощьюФеникса(это должно напечатать<123>):

test_parser("123", (string("Hello") | int_)[std::cout << _1 << std::endl]);


PrevUpHomeNext

Статья Alternative Parser (a | b) раздела Spirit 2.5.2 Parser Operators может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Parser Operators ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 08:35:28/0.0067851543426514/0