Python PEG 中 bitwise_or 的用途是什么?

What is the purpose of bitwise_or in Python PEG?

PEG语法中的bitwise_or是什么意思?更准确地说,在它甚至没有解析 | 的上下文中有很多 bitwise_or但也有发生。 bitwise_or 在 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

注意这里的bitwise_or这个词。问题是那个不是 PEG 中的竖线。

“按位或运算符”又名 | 具有 lowest precedence of regular binary operators. The only binary operators with lower precedence are comparison operators, which are subject to chaining – 例如,a < b < c 大致等同于 a < b and b < c – 因此表现特殊。

对于 PEG 解析器,优先级通常使用 precedence climbing 进行编码。这意味着 lower 优先子句匹配自身或 next 优先子句。因此,运算符优先级“| < ^ < & < ...”在按位或、按位异或、按位与等阶梯中编码:

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_or 成为匹配所有二元运算符的“入口点”:它可能遵循 bitwise_xor,可能遵循 bitwise_and,依此类推优先运算符。值得注意的是,这意味着 语法规则 bitwise_or 可以匹配不包含 操作 “按位或”的输入 – 例如,bitwise_or 匹配 a ^ b.

因此,bitwise_or用于二元运算符可能出现的任何位置。