【问题标题】:Parsing a string into a class hierarchy将字符串解析为类层次结构
【发布时间】:2013-06-27 14:56:10
【问题描述】:
假设有一个格式如下的字符串:
"2 + 3 * (5 + 2) * -1 - 2"
(只是一个例子,不一定是算术语法)
被解析为基于类的层次结构
add(2,sub(mul(mul(3,add(5,2)),-1),2))
我正在寻找一种有效的方法来进行这种解析。目前的问题是我不确定这种解析被称为什么。因此我找不到正确的来源/参考。有什么建议吗?
【问题讨论】:
标签:
python
parsing
syntax
pseudocode
【解决方案1】:
如果这是一个合法的 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,您可以穿过这棵树。
【解决方案2】:
如果您想为自定义语言(通常称为 DSL - 领域特定语言)构建高效的解析器,那么您需要查看解析器生成器。这些通常如下工作:
- 您需要以某种格式为您的语言编写一个语法(语法代表您的语言规则)。
- 解析器生成器提供了一个工具,可以读取您的语法并生成解析语句所需的词法分析器和解析器代码。
- 生成的词法分析器和解析器将能够读取一个字符串,如果该字符串符合您指定的语法,则构建一个 AST(抽象语法树),它表示所分析内容的逻辑结构。
- 然后,您通常会将词法分析器和解析器集成到您自己的工具中,该工具实际上会对生成的 AST 做一些事情。
这是parser generators in Python 的一个很好的参考。我唯一有经验的是 ANTLR,我可以推荐它,因为它非常有能力和强大。
值得注意的是,如果您没有这方面的经验,那么构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的示例(例如提供的示例)来说也可能是多余的。但是,如果您想为一种非平凡的语言构建一个高效的解析器,那么解析器生成器可能是要走的路。