【发布时间】:2023-01-31 09:22:20
【问题描述】:
我正在使用 pyparsing,我需要能够从表达式中收集所有变量名。看起来 setResultsName 应该可以做到这一点,但是对于带有括号或以其他方式分组的表达式,变量名是嵌套的。
例如,
ParserElement.enablePackrat()
LPAREN, RPAREN, COMMA = map(Suppress, "(),")
expr = Forward()
number = pyparsing_common.number
fn_call = Group(CaselessKeyword('safe_divide') + LPAREN + expr + COMMA + expr + RPAREN)
reserved_words = CaselessKeyword('safe_divide')
variable = ~reserved_words + pyparsing_common.identifier
operand = number | fn_call | variable.setResultsName('var', listAllMatches=True)
unary_op = oneOf("! -")
power_op = Literal("^")
multiplicative_op = oneOf("* / %")
additive_op = oneOf("+ -")
logical_op = oneOf("&& ||")
expr <<= infixNotation(
operand,
[
(unary_op, 1, opAssoc.RIGHT),
(power_op, 2, opAssoc.RIGHT),
(multiplicative_op, 2, opAssoc.LEFT),
(additive_op, 2, opAssoc.LEFT),
(logical_op, 2, opAssoc.LEFT),
],
)
parsed = expr.parseString('(a + b) + c', parse_all=True)
print(parsed.dump())
这给
[[['a', '+', 'b'], '+', 'c']]
[0]:
[['a', '+', 'b'], '+', 'c']
- var: [['c']]
[0]:
['c']
[0]:
['a', '+', 'b']
- var: [['a'], ['b']]
[0]:
['a']
[1]:
['b']
[1]:
+
[2]:
c
返回变量的地方,但不是以易于访问的格式,尤其是对于更复杂的表达式。有没有办法收集所有嵌套变量?
有一个类似的问题here,但那里的解决方法会错误地将关键字标记为变量。
【问题讨论】:
-
你想要什么结果?特别是,如果一个变量出现了多次,它是否应该相应地在结果中重复?或者你只是想要放使用的变量名称?