2013-06-27 53 views
1

假设存在这样的格式的字符串:解析字符串转换成类层次结构

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

(只是一个例子,它并没有成为一个算术语法)

要解析为基于类的层次结构

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

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

+0

来源/参考从这里开始:https://en.wikipedia.org/wiki/Parsing#Overview_of_process – georg

+0

你可能也看看http://en.wikipedia.org/wiki/Shunting-yard_algorithm – kindall

回答

1

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

  • 您需要为您的语言以特定格式(语法代表您的语言的规则)放在一起的语法。
  • 解析器生成器提供了一个工具,它将读取您的语法并生成您​​需要解析语句的解析器代码的词法分析器代码。
  • 生成的词法分析程序将能够读取一个字符串,并且如果该字符串符合您指定的语法,则构造一个AST(抽象语法树),它表示所分析的逻辑结构。
  • 然后,您通常会将词法分析器&解析器集成到您自己的工具中,该工具实际上会对生成的AST执行某些操作。

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

值得注意的是,如果您没有这方面的经验,构建语言语法和生成解析器可能是一个相当费力的过程,而且对于非常简单的示例(如提供过滤器的示例)也是如此。然而,如果你想为一个非平凡的语言构建一个高效的解析器,那么解析器生成器可能是一条可行的路。

+0

谢谢!我会研究它。 – Erwin

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您可以通过此树行走。