Функции синтаксического анализа - PullRequest
2 голосов
/ 21 января 2009

Я делаю синтаксический анализатор скриптов на python, и я немного застрял. Я не совсем уверен, как анализировать строку для всех ее функций (или даже только для одной функции за раз), а затем искать функцию с этим именем, и, если она существует, выполнить эту функцию за исключением написания массивного списка, если elif еще блок ....

EDIT

Это для моего собственного языка сценариев, который я создаю. Ничего сложного, но у меня есть стандартная библиотека из 8 функций или около того, чтобы мне нужно было ее запускать, как мне разобрать строку и запустить функцию, названную в строке?

Ответы [ 4 ]

3 голосов
/ 21 января 2009

Как только вы получите имя функции, используйте команду 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)

Вы также можете посмотреть на модуль cmd в stdlib, чтобы выполнить свой урок. Он может предоставить вам интерфейс командной строки для вашего языка с автоматическим завершением команды табуляции.

2 голосов
/ 21 января 2009

Check PyParsing , он позволяет определять грамматику непосредственно в коде Python:

Предполагая, что вызов функции просто somename():

>>> from pyparsing import *
>>> grammar = Word(alphas + "_",  alphanums + "_")("func_name") + "()" + StringEnd()
>>> grammar.parseString("ab()\n")["func_name"]
"ab"   
0 голосов
/ 21 января 2009

Все зависит от того, какой код вы анализируете.

Если вы анализируете синтаксис Python, используйте модуль parser из Python: http://docs.python.org/library/parser.html

Полный список библиотек синтаксических анализаторов, доступных для Python, можно найти по адресу: http://nedbatchelder.com/text/python-parsers.html

0 голосов
/ 21 января 2009

Взгляните на PLY . Это должно помочь вам сохранить чистоту спецификации вашего парсера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...