我需要指定一个定义为ambn
的表达式,以便:
-
m
+n
=t
;t
是固定的 - 0<;=
m
<;=t
-1 - 1
简化后的当前代码如下:
from pyparsing import Char, Combine
def ab(t):
first = Char('a')[0, t - 1]
second = Char('b')[1, t]
expression = first + second
expression.add_condition(
lambda result: len(result) == t,
message = f'Total length must be {t}'
)
return Combine(expression)
但是,该表达式会消耗它所能找到的所有内容,并在没有回溯的情况下对该结果调用条件函数.例如:
grammar = (ab(4) | Char('b'))[1, ...].set_name('grammar')
grammar.parse_string('abbbb', parse_all = True)
ParseException: Expected grammar, found 'abbbb' (at char 0), (line:1, col:1)
我想要的结果是['abbb', 'b']
,如果将所讨论的表达式指定为:
expression = Or([
Char('a')[m] + Char('b')[t - m]
for m in range(0, t)
])
...但这看起来不必要的冗长.
有没有更好的办法?