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)提供的运算符优先级声明时。
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)提供的运算符优先级声明时。