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

Operators

Boost , ,

Operators

Операторы используются как средство для композиции и встраивания объекта. Простые парсеры могут быть составлены для формирования композитов через перегрузку оператора, созданную для приближения синтаксиса варианта расширенной обратной нормальной формы (EBNF). Выражение, такое как:

    a | b

Фактически получается новый тип парсера, который представляет собой композицию операндов a и b. Если бы a и b имели типchlit<>, результат имел бы составной тип:

    alternative<chlit<>, chlit<> >

В общем, для любого двоичного оператора он возьмет два своих аргумента, парсер1 и парсер2, и создаст новый составной парсер формы.

    op<parser1, parser2>

где parser1 и parser2 сами могут быть произвольно сложными парсерами, с единственными ограничениями, которые накладывает ваш компилятор.

Set Operators

Set operators
a | b Union Match a or b. Also referred to as alternative
a & b Intersection Match a and b
a - b Difference Match a but not b. If both match and b's matched text is shorter than a's matched text, a successful match is made
a ^ b XOR Match a or b, but not both

Короткое замыкание

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

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

Intersections

Some researchers assert that the intersections (e.g. a & b) let us define context sensitive languages ("XBNF" [citing Leu-Weiner, 1973]). "The theory of defining a language as the intersection of a finite number of context free languages was developed by Leu and Weiner in 1973".

~ Operator

The complement operator ~ was originally put into consideration. Further understanding of its value and meaning leads us to uncertainty. The basic problem stems from the fact that ~a will yield U-a, where U is the universal set of all strings. However, where it makes sense, some parsers can be complemented (see the primitive character parsers for examples).

Sequencing Operators

Sequencing operators
a >> b Sequence Match a and b in sequence
a && b Sequential-and Sequential-and. Same as above, match a and b in sequence
a || b Sequential-or Match a or b in sequence

Оператор секвенирования>>может рассматриваться как последовательный и оператор. Выражениеa&&bчитается как соответствие a и b в последовательности. Продолжая эту логику, мы также можем иметь оператор последовательности, где выражениеa| |bчитается как соответствие a или b и в последовательности. То есть, если и a, и b совпадают, то они должны быть в последовательности; это эквивалентноa >>!b | b.

Optional and Loops

Optional and Loops
*a Kleene star Match a zero (0) or more times
+a Positive Match a one (1) or more times
!a Optional Match a zero (0) or one (1) time
a % b List Match a list of one or more repetitions of a separated by occurrences of b. This is the same as a >> *(b >> a). Note that a must not also match b

Если присмотреться повнимательнее, то заметим, что мы обобщили факультативное выражение формы.в той же категории, что и петли. Это логично, учитывая, что факультатив соответствует выражению, следующему за ним 0 или 1 раз.

Операнд первобытного типа

Для бинарных операторов один из операндов, но не оба, может бытьchar,wchar_t,char const*илиwchar_t const*. Где P является парсерным объектом, вот несколько примеров:

    P | 'x'
    P - L"Hello World"
    'x' >> P
    "bebop" >> P

Важно подчеркнуть, что C++ требует, чтобы операторы были перегружены только в том случае, если по крайней мере один аргумент является типом, определенным пользователем. Как правило, в выражении, включающем несколько операторов, явного ввода левого операнда в качестве парсера достаточно, чтобы вызвать распространение всех остальных операндов на его право считаться парсерами. Примеры:

    r = 'a' | 'b' | 'c' | 'd';          // ill formed
    r = ch_p('a')  | 'b' | 'c' | 'd';   // OK

Второй случай рассматривается следующим образом:

    r  (((chlit<char> | char) | char) | char)
    a  (chlit<char> | char)
    r  (((a) | char) | char)
    b  (a | char)
    r  (((b)) | char)
    c  (b | char)
    r  (((c)))

Преимущество оператора и группировка

Поскольку мы определяем наш метаязык на C++, мы следуем правилам приоритета оператора C/C++. Группировка выражений внутри скобок перекрывает это (например,*a|b)гласит: соответствовать a или b нулю (0) или более раз).



 

Статья Operators раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:25:36/0.0065310001373291/1