【问题标题】:Parsing Functions解析函数
【发布时间】:2010-10-02 16:09:15
【问题描述】:

我正在用 python 制作一个脚本解析器,但我有点卡住了。我不太确定如何解析一行的所有函数(甚至一次只解析一个函数),然后搜索具有该名称的函数,如果存在,则执行该函数而不是编写大量列表 if elif否则阻止....

编辑

这是我自己正在制作的脚本语言。没什么复杂的,但是我有一个包含 8 个函数的标准库,所以我需要能够运行,我如何解析一行并运行该行中命名的函数?

【问题讨论】:

  • 什么?你在解析什么语言?请提供您正在解析的语言。你有什么代码?或者这是一个设计问题?如果是设计问题,请以我们可以看到它们在代码中的样子的形式呈现候选算法。
  • 请提供您正在解析的语言的语法。由于您的语言可能喜欢任何东西,因此无法谈论您的具体问题。

标签: python parsing


【解决方案1】:

获得函数名后,使用 dispatch dict 运行函数:

def mysum(...): ...
def myotherstuff(...): ...

# create dispatch dict:
myfunctions = {'sum': mysum, 'stuff': myotherstuff}

# run your parser:
function_name, parameters = parse_result(line)

# run the function:
myfunctions[function_name](parameters)

或者使用命令创建一个类:

class Commands(object):
    def do_sum(self, ...): ...
    def do_stuff(self, ...): ...
    def run(self, funcname, params):
        getattr(self, 'do_' + funcname)(params)

cmd = Commands()
function_name, parameters = parse_result(line)
cmd.run(function_name, parameters)

您还可以查看 stdlib 中的 cmd module 来完成您的课程。它可以自动为您提供适合您的语言的命令行界面,并自动完成选项卡命令。

【讨论】:

    【解决方案2】:

    查看PyParsing,它允许直接在 Python 代码中定义语法:

    假设函数调用只是somename()

    >>> from pyparsing import *
    >>> grammar = Word(alphas + "_",  alphanums + "_")("func_name") + "()" + StringEnd()
    >>> grammar.parseString("ab()\n")["func_name"]
    "ab"   
    

    【讨论】:

    • 这很有帮助,但我将如何运行该功能?
    • 参见。 nosklo 的答案。
    【解决方案3】:

    看看PLY。它应该可以帮助您保持解析器规范的整洁。

    【讨论】:

      【解决方案4】:

      这完全取决于您要解析的代码。

      如果您正在解析 Python 语法,请使用 Python 中的 parser 模块: http://docs.python.org/library/parser.html

      可用于 Python 的解析器库的完整列表,您可以在以下位置找到:http://nedbatchelder.com/text/python-parsers.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        相关资源
        最近更新 更多