【问题标题】: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,我可以推荐它,因为它非常有能力和强大。

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

    【讨论】:

    • 谢谢!我会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2018-10-20
    • 2015-09-28
    • 2013-03-18
    • 2014-03-18
    • 2012-07-25
    相关资源
    最近更新 更多