我正在python中创建一个脚本解析器,我有点卡住了。我不太确定如何为其所有函数解析一行(或者甚至一次只解析一个函数),然后搜索具有该名称的函数,如果存在,则执行该函数,如果是elif则写入大量列表否则阻止......
修改的
这是我自己编写的脚本语言。它没有什么非常复杂,但我有一个8个函数的标准库,或者我需要能够运行,我如何解析一行并运行该行中命名的函数?
答案 0 :(得分:3)
获得函数名称后,使用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来完成您的课程。它可以为您提供语言的命令行界面,并自动执行tab命令。
答案 1 :(得分:2)
签出PyParsing,它允许直接在Python代码中定义语法:
假设函数调用只是somename()
:
>>> from pyparsing import *
>>> grammar = Word(alphas + "_", alphanums + "_")("func_name") + "()" + StringEnd()
>>> grammar.parseString("ab()\n")["func_name"]
"ab"
答案 2 :(得分:0)
看看PLY。它应该可以帮助您保持解析器规范的清洁。
答案 3 :(得分:0)
这完全取决于您要解析的代码。
如果要解析Python语法,请使用Python中的parser
模块:
http://docs.python.org/library/parser.html
可用于Python的完整解析器库列表,您可以在以下位置找到:http://nedbatchelder.com/text/python-parsers.html