![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
OperatorsBoost , ,
Операторы используются как средство для композиции и встраивания объекта. Простые парсеры могут быть составлены для формирования композитов через перегрузку оператора, созданную для приближения синтаксиса варианта расширенной обратной нормальной формы (EBNF). Выражение, такое как:
Фактически получается новый тип парсера, который представляет собой композицию операндов a и b. Если бы a и b имели типchlit<>, результат имел бы составной тип:
В общем, для любого двоичного оператора он возьмет два своих аргумента, парсер1 и парсер2, и создаст новый составной парсер формы.
где parser1 и parser2 сами могут быть произвольно сложными парсерами, с единственными ограничениями, которые накладывает ваш компилятор. Set Operators
Короткое замыкание Альтернативные операнды испытываются один за другим на основе первого пришествия, начиная с самого левого операнда. После того, как найдена успешно подобранная альтернатива, парсер завершает поиск, по существу, замыкая поиск других потенциально жизнеспособных кандидатов. Это короткое замыкание косвенно придает наивысший приоритет самой левой альтернативе. Короткое замыкание выполняется таким же образом, как и логические выражения C или C++; например.еслихил.3| |y<2], где, еслиxоценивается как менее 3, тестy<2вообще не проводится. В дополнение к предоставлению имплицитного правила приоритета для альтернатив, которое необходимо, учитывая недетерминированный характер компилятора парсера Spirit, короткое замыкание увеличивает время выполнения. Если порядок ваших альтернатив логически неуместен, стремитесь поставить наиболее распространенный выбор на первое место для максимальной эффективности.
Sequencing Operators
Оператор секвенирования>>может рассматриваться как последовательный и оператор. Выражениеa&&bчитается как соответствие a и b в последовательности. Продолжая эту логику, мы также можем иметь оператор последовательности, где выражениеa| |bчитается как соответствие a или b и в последовательности. То есть, если и a, и b совпадают, то они должны быть в последовательности; это эквивалентноa >>!b | b. Optional and Loops
Операнд первобытного типа Для бинарных операторов один из операндов, но не оба, может бытьchar,wchar_t,char const*илиwchar_t const*. Где P является парсерным объектом, вот несколько примеров:
Важно подчеркнуть, что C++ требует, чтобы операторы были перегружены только в том случае, если по крайней мере один аргумент является типом, определенным пользователем. Как правило, в выражении, включающем несколько операторов, явного ввода левого операнда в качестве парсера достаточно, чтобы вызвать распространение всех остальных операндов на его право считаться парсерами. Примеры:
Второй случай рассматривается следующим образом:
Преимущество оператора и группировка Поскольку мы определяем наш метаязык на C++, мы следуем правилам приоритета оператора C/C++. Группировка выражений внутри скобок перекрывает это (например,*a|b)гласит: соответствовать a или b нулю (0) или более раз).
Copyright © 1998-2003 Joel de Guzman
Статья Operators раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |