ply 的 YACC 是否支持扩展巴科斯范式?

Does ply's YACC support the Extended Backus-Naur Form?

The examples I've seen 总是使用 "simple" BNF。这是我的愚蠢开发的一部分示例:

def p_expression(p):
    """expression : NUMBER
                | NAME
                | NEGATION
                | INCREMENT
                | DECREMENT
                | expression operator expression"""

if __name__ == "__main__":
    lex.lex()
    yacc.yacc()
    data = "32 <+> 10 |"
    result = yacc.parse(data)

如果我想解析一个带括号的数学表达式和它的整个递归地狱怎么办just like in this answer that uses the extended one?可能吗?

不,PLY(像 yacc)不支持扩展 BNF。

您引用的页面提供了构建 top-down 解析器的策略,而 yacc(以及 Bison、PLY 和其他衍生产品)构建的解析器构建了 bottom-解析器。自下而上解析器的优点是解析的语法与语言的实际语法结构更接近,因此可以直接用于构建AST(抽象语法树)。

BNF 中的算术表达式文法通常非常简单(尽管不像您问题中的歧义文法那么简单),尤其是当您使用 yacc(和 PLY)提供的运算符优先级声明时。