gpt4 book ai didi

python - 使用 pyparsing 解析嵌套函数调用

转载 作者:太空狗 更新时间:2023-10-29 20:44:13 26 4
gpt4 key购买 nike

我正在尝试使用 pyparsing 来解析以下形式的函数调用:

f(x, y)

这很简单。但由于它是一个递归下降解析器,它也应该很容易解析:

f(g(x), y)

那是我无法得到的。这是一个简单的例子:

from pyparsing import Forward, Word, alphas, alphanums, nums, ZeroOrMore, Literal

lparen = Literal("(")
rparen = Literal(")")

identifier = Word(alphas, alphanums + "_")
integer = Word( nums )

functor = identifier

# allow expression to be used recursively
expression = Forward()

arg = identifier | integer | expression
args = arg + ZeroOrMore("," + arg)

expression << functor + lparen + args + rparen

print expression.parseString("f(x, y)")
print expression.parseString("f(g(x), y)")

这是输出:

['f', '(', 'x', ',', 'y', ')']
Traceback (most recent call last):
File "tmp.py", line 14, in <module>
print expression.parseString("f(g(x), y)")
File "/usr/local/lib/python2.6/dist-packages/pyparsing-1.5.6-py2.6.egg/pyparsing.py", line 1032, in parseString
raise exc
pyparsing.ParseException: Expected ")" (at char 3), (line:1, col:4)

为什么我的解析器将内部表达式的仿函数解释为独立标识符?

最佳答案

很好地发现 identifier 在您的 arg 定义中屏蔽了 expression。以下是有关您的解析器的一些其他提示:

x + ZeroOrMore(',' + x) 是 pyparsing 解析器中非常常见的模式,因此 pyparsing 包含一个辅助方法 delimitedList,它允许您替换该表达式使用 delimitedList(x)。实际上,delimitedList 还做了另一件事——它抑制了定界逗号(或其他定界符,如果使用可选的 delim 参数),基于定界符有用的概念解析时间,但在之后尝试筛选已解析数据时只是杂乱无章的标记。因此,您可以将 args 重写为 args = delimitedList(arg),您将只获得列表中的 args,没有必须“跳过”的逗号。

您可以使用 Group 类在解析的标记中创建实际结构。这将为您构建嵌套层次结构,而无需遍历此列表以查找“(”和“)”来告诉您何时在函数嵌套中下降了一个级别:

 arg = Group(expression) | identifier | integer
expression << functor + Group(lparen + args + rparen)

由于您的参数正在为您分组,您可以进一步抑制括号,因为就像分隔逗号一样,它们在解析期间完成它们的工作,但是对于您的标记分组,它们不是需要更长的时间:

lparen = Literal("(").suppress()
rparen = Literal(")").suppress()

我假设“h()”是一个有效的函数调用,只是没有参数。您可以使用 Optional 允许 args 是可选的:

expression << functor + Group(lparen + Optional(args) + rparen)

现在你可以解析“f(g(x), y, h())”了。

欢迎使用 pyparsing!

关于python - 使用 pyparsing 解析嵌套函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com