gpt4 book ai didi

python - pyparsing 的递归表达式

转载 作者:太空狗 更新时间:2023-10-30 00:46:49 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何做一个左结合表达式,其中递归(不包含在任何东西中)表达式是可能的。例如,我想这样做:

expr + OP + expr

1 x 2 x 3 等 2 个操作解析为 (expr OP expr) OP expr 结果。

如果我试图阻止 expr 无限递归解析,我可以这样做:

expr -> Group(simple_expr + OP + expr)
| simple_expr

但随后我会得到 expr OP (expr OR expr) 结果。

如何强制左侧绑定(bind)?

编辑:我知道 operatorPrecedence 但当运算符是 "IS"+ Optional("NOT") 或类似的时,它似乎没有正确匹配.

最佳答案

下面是一个示例解析操作,它将获取 token 的平面列表并将它们嵌套,就像左递归解析一样:

from pyparsing import *

# parse action -maker
def makeLRlike(numterms):
if numterms is None:
# None operator can only by binary op
initlen = 2
incr = 1
else:
initlen = {0:1,1:2,2:3,3:5}[numterms]
incr = {0:1,1:1,2:2,3:4}[numterms]

# define parse action for this number of terms,
# to convert flat list of tokens into nested list
def pa(s,l,t):
t = t[0]
if len(t) > initlen:
ret = ParseResults(t[:initlen])
i = initlen
while i < len(t):
ret = ParseResults([ret] + t[i:i+incr])
i += incr
return ParseResults([ret])
return pa


# setup a simple grammar for 4-function arithmetic
varname = oneOf(list(alphas))
integer = Word(nums)
operand = integer | varname

# ordinary opPrec definition
arith1 = operatorPrecedence(operand,
[
(None, 2, opAssoc.LEFT),
(oneOf("* /"), 2, opAssoc.LEFT),
(oneOf("+ -"), 2, opAssoc.LEFT),
])

# opPrec definition with parseAction makeLRlike
arith2 = operatorPrecedence(operand,
[
(None, 2, opAssoc.LEFT, makeLRlike(None)),
(oneOf("* /"), 2, opAssoc.LEFT, makeLRlike(2)),
(oneOf("+ -"), 2, opAssoc.LEFT, makeLRlike(2)),
])

# parse a few test strings, using both parsers
for arith in (arith1, arith2):
print arith.parseString("A+B+C+D+E")[0]
print arith.parseString("A+B+C*D+E")[0]
print arith.parseString("12AX+34BY+C*5DZ+E")[0]

打印:

(正常)

['A', '+', 'B', '+', 'C', '+', 'D', '+', 'E']
['A', '+', 'B', '+', ['C', '*', 'D'], '+', 'E']
[['12', 'A', 'X'], '+', ['34', 'B', 'Y'], '+', ['C', '*', ['5', 'D', 'Z']], '+', 'E']

(类似LR)

[[[['A', '+', 'B'], '+', 'C'], '+', 'D'], '+', 'E']
[[['A', '+', 'B'], '+', ['C', '*', 'D']], '+', 'E']
[[[[['12', 'A'], 'X'], '+', [['34', 'B'], 'Y']], '+', ['C', '*', [['5', 'D'], 'Z']]], '+', 'E']

关于python - pyparsing 的递归表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4571441/

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