将字符串解析为类层次结构

时间:2013-06-27 14:56:11

标签: python parsing syntax pseudocode

假设有一个字符串,格式如下:

"2 + 3 * (5 + 2) * -1 - 2"

(只是一个例子,它不一定是算术语法)

要解析为基于类的层次

add(2,sub(mul(mul(3,add(5,2)),-1),2))

我正在寻找一种有效的解析方法。目前的问题是我不确定这种解析是什么。因此我找不到合适的来源/参考资料。有什么建议吗?

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 - 域特定语言)构建有效的解析器,那么您需要查看解析器生成器。这些通常如下工作:

  • 您需要以特定格式为您的语言编写语法(语法代表您的语言规则)。
  • 解析器生成器提供了一个工具,它将读取您的语法并生成词法分析器和你需要解析语句的解析器代码。
  • 生成的词法分析器&解析器将能够读取一个字符串,如果该字符串符合您指定的语法,则构造一个AST(抽象语法树),它表示解析内容的逻辑结构。
  • 然后,您通常会整合词法分析器和解析器到你自己的工具中,它实际上对生成的AST做了一些事情。

这是parser generators in Python的一个很好的参考。我所经历的唯一一个是ANTLR,我可以推荐它非常强大和强大。

值得注意的是,如果你没有这方面的经验,那么构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的例子,例如提供它会有点过分的例子。但是,如果你想为一个非平凡的语言构建一个有效的解析器,那么解析器生成器可能就是这样。