1

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

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

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

解析为基于类的层次结构

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

我正在寻找一种有效的方法来进行这种解析。目前的问题是我不确定这种解析被称为什么。因此我找不到正确的来源/参考。有什么建议么?

4

2 回答 2

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你可以穿过这棵树。

于 2013-06-27T14:59:54.403 回答
1

如果您想为自定义语言(通常称为 DSL - 领域特定语言)构建高效的解析器,那么您需要查看解析器生成器。这些通常按如下方式工作:

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

这是Python中解析器生成器的一个很好的参考。我唯一有经验的是 ANTLR,我可以推荐它,因为它非常有能力和强大。

值得注意的是,如果您没有这方面的经验,那么构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的示例(例如提供的示例)来说,这将是矫枉过正的。但是,如果您想为一种非平凡的语言构建一个高效的解析器,那么解析器生成器可能是要走的路。

于 2013-06-27T15:27:52.813 回答