Какова цель bitwise_or в Python PEG?

Что значит в грамматике PEG? Точнее, существует множество контекстов, в которых он даже не анализирует | пока есть случаи. Служит ли в PEG какой-либо другой цели, кроме | в Python?

Пример извлечен из Python PEG:-

      comparison[expr_ty]:
    | a=bitwise_or b=compare_op_bitwise_or_pair+ {
        _PyAST_Compare(
            a,
            CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)),
            CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)),
            EXTRA) }
    | bitwise_or

Обратите внимание на слово здесь. Вопрос в том, что не в вертикальной полосе в PEG.

1 ответ

Решение

«Побитовый оператор или», также известный как «побитовый оператор», имеет самый низкий приоритет среди обычных бинарных операторов . Единственными бинарными операторами с более низким приоритетом являются операторы сравнения, которые могут быть объединены в цепочку, например, a < b < c примерно эквивалентно a < b and b < c - и при этом вести себя особым образом.

Для синтаксического анализатора PEG приоритет обычно кодируется с помощью нарастания приоритета . Это означает, что предложение более низкого приоритета соответствует либо самому себе, либо следующему предложению приоритета. Таким образом, приоритет оператора " | < ^ < & <... "кодируется в виде лестницы побитового или, побитового xor, побитового и т. д .:

      bitwise_or:
    | bitwise_or '|' bitwise_xor 
    | bitwise_xor
bitwise_xor:
    | bitwise_xor '^' bitwise_and 
    | bitwise_and
bitwise_and:
    | bitwise_and '&' shift_expr 
    | shift_expr

Это делает «точку входа», которая соответствует всем бинарным операторам: она может быть отложена до bitwise_xor, который может быть отложен до bitwise_andи так далее до оператора с наивысшим приоритетом. Примечательно, что это означает, что правило грамматики может сопоставлять ввод, который не содержит операции «побитовое или» - например, соответствует a ^ b.

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

Другие вопросы по тегам