假设存在这样的格式的字符串:解析字符串转换成类层次结构
"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))
我正在寻找一种有效的方法来完成此分析。目前的问题是我不确定这种解析是什么。因此我无法找到正确的来源/参考。有什么建议么?
如果您想为自定义语言(通常称为DSL域特定语言)构建高效的解析器,那么您需要查看解析器生成器。这些典型的工作如下:
这里有一个很好的参考parser generators in Python。我有经验的唯一一个是ANTLR,我可以推荐它是非常有能力和强大的。
值得注意的是,如果您没有这方面的经验,构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的示例(如提供过滤器的示例)也是如此。然而,如果你想为一个非平凡的语言构建一个高效的解析器,那么解析器生成器可能是一条可行的路。
谢谢!我会研究它。 – Erwin
如果这是一个合法的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
您可以通过此树行走。
来源/参考从这里开始:https://en.wikipedia.org/wiki/Parsing#Overview_of_process – georg
你可能也看看http://en.wikipedia.org/wiki/Shunting-yard_algorithm – kindall