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

Expectation 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

Есть случаи, когда ожидается, что вход должен соответствовать определенному парсеру или вход недействителен. Такие случаи обычно возникают после сопоставления части грамматики, так что контекст полностью известен. В такой ситуации несоответствие должно привести к исключению. Например, при разборе адреса электронной почты после сопоставления имени и «@» должно быть доменное имя или адрес недействителен.

Оператор ожидания (>) требует, чтобы следующий парсер соответствовал входу или было выпущено исключение. Используя on_error(), это исключение можно обработать, позвонив обработчику с контекстом, в котором может быть сообщено о неудачном разборе.

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

Как ипоследовательность, оператор ожидания<a >b>анализирует два или более операндов (<a>,<b>, ... и т. д.) последовательно:

a > b > ...

В то время как равнинаПоследовательностьпросто возвращает несоответствие (возвращается<false>), когда один из элементов терпит неудачу, ожидание:<>>Оператор бросает<expectation_failure><<Iter>>, когда второй или последующие операнды (все операнды, кроме первого) не совпадают.

Header
// forwards to <boost/spirit/home/qi/operator/expect.hpp>
#include <boost/spirit/include/qi_expect.hpp>

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

Model of

Notation

a, b

<Parser>

Iter

<ForwardIterator>Тип

Expectation Failure

Если же кто-либо, кроме первого операнда, не сравнится с ним,<expectation_failure<Iter>>бросается:

template <typename Iter>
struct expectation_failure : std::runtime_error
{
    Iter first;           // [first, last) iterator pointing
    Iter last;            // to the error position in the input.
    info what_;       // Information about the nature of the error.
};
Expression Semantics

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

выражение

Семантика

<a> b>

Матч<a>, за которым следует<b>. Если<a>не сработает, не сработает. Если<b>не удается, бросьте<expectation_failure<Iter>>

.
Attributes

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

выражение

атрибут

<a> b>

a: A, b: B --> (a > b): tuple<A, B>
a: A, b: Unused --> (a > b): A
a: Unused, b: B --> (a > b): B
a: Unused, b: Unused --> (a > b): Unused
a: A, b: A --> (a > b): vector<A>
a: vector<A>, b: A --> (a > b): vector<A>
a: A, b: vector<A> --> (a > b): vector<A>
a: vector<A>, b: vector<A> --> (a > b): vector<A>

Complexity

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

Example
[Note]Note

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

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

using boost::spirit::ascii::char_;
using boost::spirit::qi::expectation_failure;

Код ниже использует оператор ожидания, чтобы бросить<expectation_failure>с преднамеренной ошибкой разбора, когда<"o">ожидается и<"i">то, что находится во входе. Блок<catch>печатает информацию, связанную с ошибкой. Примечание: Это низкоуровневый код, который демонстрируетголый металл.. Как правило, вы используете контроллер ошибок для устранения ошибки.

try
{
    test_parser("xi", char_('x') > char_('o')); // should throw an exception
}
catch (expectation_failure<char const*> const& x)
{
    std::cout << "expected: "; print_info(x.what_);
    std::cout << "got: \"" << std::string(x.first, x.last) << '"' << std::endl;
}

Приведенный выше код будет печатать:

expected: tag: literal-char, value: o
got: "i"

PrevUpHomeNext

Статья Expectation 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-19 21:46:14/0.0072760581970215/0