Функции синтаксического анализа

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

РЕДАКТИРОВАТЬ

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

Какие? Какой язык разбираешь? Укажите язык, который вы разбираете, пожалуйста. Какой у вас код? Или это вопрос дизайна? Если это вопрос дизайна, представьте алгоритмы-кандидаты в той форме, в которой мы сможем увидеть, как они могут выглядеть в коде.

S.Lott 21.01.2009 14:51

Укажите синтаксис языка, который вы анализируете. Поскольку ваш язык может нравиться НИЧЕГО, невозможно говорить о вашем конкретном вопросе.

S.Lott 21.01.2009 15:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
7 683
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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

это полезно, но как мне тогда запустить функцию?

The.Anti.9 21.01.2009 15:14

Ср. ответ носкло за то.

Torsten Marek 21.01.2009 19:22

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

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

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

Ответ принят как подходящий

Как только вы получите имя функции, используйте команду отправки для запуска функции:

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, чтобы сделать свой класс. Он может предоставить вам интерфейс командной строки для вашего языка с автоматическим завершением команды табуляции.

Другие вопросы по теме