假设有一个字符串,格式如下:
"2 + 3 * (5 + 2) * -1 - 2"
(只是一个例子,它不一定是算术语法)
要解析为基于类的层次
add(2,sub(mul(mul(3,add(5,2)),-1),2))
我正在寻找一种有效的解析方法。目前的问题是我不确定这种解析是什么。因此我找不到合适的来源/参考资料。有什么建议吗?
答案 0 :(得分:2)
如果这是一个合法的python表达式,你可以使用ast module,特别是ast.parse
:
>>> import ast
>>> s = ast.parse("2 + 3 * (5 + 2) * -1 - 2")
>>> ast.dump(s)
'Module(body=[Expr(value=BinOp(left=BinOp(left=Num(n=2), op=Add(), right=BinOp(l
eft=BinOp(left=Num(n=3), op=Mult(), right=BinOp(left=Num(n=5), op=Add(), right=N
um(n=2))), op=Mult(), right=Num(n=-1))), op=Sub(), right=Num(n=2)))])'
使用ast.Visitor
,您可以浏览此树。
答案 1 :(得分:1)
如果您想为自定义语言(通常称为DSL - 域特定语言)构建有效的解析器,那么您需要查看解析器生成器。这些通常如下工作:
这是parser generators in Python的一个很好的参考。我所经历的唯一一个是ANTLR,我可以推荐它非常强大和强大。
值得注意的是,如果你没有这方面的经验,那么构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的例子,例如提供它会有点过分的例子。但是,如果你想为一个非平凡的语言构建一个有效的解析器,那么解析器生成器可能就是这样。