3

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 中的竖线。

4

1 回答 1

5

“按位或运算符”又名|具有常规二元运算符的最低优先级。唯一具有较低优先级的二元运算符是比较运算符,它们受到链接的影响——例如,a < b < c大致等价于a < b and b < c——因此表现特殊。

对于 PEG 解析器,优先级通常使用优先级攀升进行编码。这意味着较低优先级子句匹配其自身或下一个优先级子句。因此,运算符优先级“ |< ^< &< ...”被编码为按位或、按位异或、按位与等的梯形图:

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_ormatches a ^ b

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

于 2021-05-20T13:20:13.757 回答