问题描述
bitwise_or
在 PEG 语法中是什么意思?更准确地说,在上下文中有很多 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,EXTRA) }
| bitwise_or
注意这里的 bitwise_or
这个词。问题在于那个不是 PEG 中的竖线。
解决方法
“按位或运算符”又名 |
具有 lowest precedence of regular binary operators。唯一具有较低优先级的二元运算符是 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
匹配 { {1}}。
因此,a ^ b
可用于二元运算符可能出现的任何位置。