Python PEG 中 bitwise_or 的目的是啥?

Posted

技术标签:

【中文标题】Python PEG 中 bitwise_or 的目的是啥?【英文标题】:What is the purpose of bitwise_or in Python PEG?Python PEG 中 bitwise_or 的目的是什么? 【发布时间】:2021-08-09 17:42:32 【问题描述】:

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, b)),
            EXTRA) 
    | bitwise_or

请注意此处的 bitwise_or 一词。问题在于,不是 PEG 中的竖线。

【问题讨论】:

【参考方案1】:

“按位或运算符”又名| 具有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匹配a ^ b

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

【讨论】:

谢谢。现在我明白了。

以上是关于Python PEG 中 bitwise_or 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python 之父的解析器系列之三:生成一个 PEG 解析器

Python 之父的解析器系列之五:左递归 PEG 语法

股票中,PEG指的是啥

正确认高分子PEG:识MTA mPEG,Myristic-acid PEG,肉豆蔻酸 PEG,PEG改性肉豆蔻酸

Fibonacci-PEG,LDPC基于Fibonacci-PEG算法的LDPC码校验矩阵的构造

极简估值教程——第一篇 速判估值与PEG的推导