Создание вызовов функций для парсера возвращаемых функций в PyParsing

Я хочу проанализировать вызовы функций, которые могут вызывать функции, "возвращенные" другими функциями:

thisReturnsFunction()()

Я сделал это:

id = Regex(r'[_a-zA-Z][_a-zA-Z0-9]*')

funcal = Forward()

value = funcal | id

funcal << value + Literal("(").suppress() + Literal(")").suppress()

Случайно, стек Python переполняется, и весь Python падает. Я знаю что value является рекурсивным и соответствует бесконечно thisReturnsFunction("Hello!"), поскольку funcal совпадает, потому что value это что-то, потому что funcal соответствует...

Как избежать этого и разработать правильный шаблон?

1 ответ

Я не уверен, что Pyparsing может анализировать функцию высокого порядка "чистым" способом. Но есть несколько "хакерских" способов: создать токен для функции, добавить обработчик для токена и создать правильную синтаксическую структуру внутри обработчика. Пример (я также добавляю токены для аргументов функции)

from pyparsing import Forward, Literal, Regex, OneOrMore, Optional, Group, delimitedList

def function_parser(s, loc, toks):
    if len(toks) <= 2:
        return [toks[0], list(toks[1])]
    else:
        return [function_parser(s, loc, toks[:len(toks)-1]), toks[-1]]

id = Regex(r'[_a-zA-Z][_a-zA-Z0-9]*')
comma = Literal(',')
funcal = Forward()
expression  =  funcal | id 
function_args = Optional(Group(delimitedList(expression,comma)),[])
funcal << id + OneOrMore(Literal("(").suppress() + function_args + Literal(")").suppress())

funcal.setParseAction(function_parser)

def test_print(string):
    l = funcal.parseString(string).asList()
    print(l)

test_print('justFunction(arg)')
test_print('justFunction(arg)',)
test_print('thisReturnsFunction()()',)
test_print('thisReturnsFunction(arg1, arg2)(arg3)')

Это производит:

['justFunction', ['arg']]
['justFunction', ['arg']]
[['thisReturnsFunction', []], []]
[['thisReturnsFunction', ['arg1', 'arg2']], ['arg3']]
Другие вопросы по тегам