在PyParsing中创建对返回函数解析器的函数调用

时间:2015-06-17 17:44:07

标签: python recursion pyparsing recursive-regex

我想解析可以通过其他函数调用函数'return'的函数调用:

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是mathing,因为funcal匹配。 ..

如何避免这种情况并设计有效模式?

1 个答案:

答案 0 :(得分:0)

我不确定,Pyparsing可以以“纯粹”的方式解析高阶函数。但是有一些'hacky'方式:为函数创建令牌,为令牌添加处理程序并在处理程序内部生成正确的语法结构。 示例(我还为函数参数添加了标记)

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']]