The examples I've seen总是使用“简单”的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怎么办?有可能吗?
答案 0 :(得分:1)
不,PLY(如yacc)不支持扩展BNF。
您引用的页面提供了构建自上而下解析器的策略,而yacc(以及Bison,PLY和其他衍生物)构建的解析器构建了自下而上的解析器。自下而上解析器的优点是用于解析的语法与语言的实际语法结构更紧密地对应,因此可以直接用于构建AST(抽象语法树)。
BNF中的算术表达式语法通常非常简单(虽然不像你的问题中的模糊语法那么简单),特别是如果你使用yacc(和PLY)提供的运算符优先级声明。