假设有一个格式如下的字符串:
"2 + 3 * (5 + 2) * -1 - 2"
(只是一个例子,它不一定是算术语法)
解析为基于类的层次结构
add(2,sub(mul(mul(3,add(5,2)),-1),2))
我正在寻找一种有效的方法来进行这种解析。目前的问题是我不确定这种解析被称为什么。因此我找不到正确的来源/参考。有什么建议么?
假设有一个格式如下的字符串:
"2 + 3 * (5 + 2) * -1 - 2"
(只是一个例子,它不一定是算术语法)
解析为基于类的层次结构
add(2,sub(mul(mul(3,add(5,2)),-1),2))
我正在寻找一种有效的方法来进行这种解析。目前的问题是我不确定这种解析被称为什么。因此我找不到正确的来源/参考。有什么建议么?
如果这是一个合法的 python 表达式,你可以使用ast 模块,特别是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
你可以穿过这棵树。
如果您想为自定义语言(通常称为 DSL - 领域特定语言)构建高效的解析器,那么您需要查看解析器生成器。这些通常按如下方式工作:
这是Python中解析器生成器的一个很好的参考。我唯一有经验的是 ANTLR,我可以推荐它,因为它非常有能力和强大。
值得注意的是,如果您没有这方面的经验,那么构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的示例(例如提供的示例)来说,这将是矫枉过正的。但是,如果您想为一种非平凡的语言构建一个高效的解析器,那么解析器生成器可能是要走的路。