pyparsing:命名结果?

pyparsing: named results?

我正在编写一个解析器来解析数学表达式,其中包含变量等。我想要所有捕获变量的列表。但我只得到最后捕获的变量。下面是一个显示问题的最小示例。

    >>> from pyparsing import *
    >>> var = Word(alphas)
    >>> expr = Forward()
    >>> expr << var('var') + ZeroOrMore(Literal('+') + expr)
    >>> foo = expr.parseString("x + y + z")
    >>> foo
    (['x', '+', 'y', '+', 'z'], {'var': [('x', 0), ('y', 2), ('z', 4)]})
    >>> foo['var']
    'z'

我期待 ['x'、'y'、'z']。我正在使用 pyparsing 2.1 版。

默认情况下,命名结果仅捕获最后一项。如果使用显式 setResultsName 方法调用,则可以通过添加可选的 listAllMatches=True 参数来获取所有项目。由于您使用的是快捷形式 var('var'),如果您以“*”结尾的结果名称将获得 listAllMatches 行为:

expr << var('var*') + ZeroOrMore(Literal('+') + expr)

我更喜欢使用 dump() 方法从解析的结果中列出正文和名称:

>>> foo = expr.parseString("x + y + z")
>>> foo.var
(['x', 'y', 'z'], {})
>>> print foo.dump()
['x', '+', 'y', '+', 'z']
- var: ['x', 'y', 'z']

顺便说一下,因为您是这样定义语法的,所以您的操作将从右到左求值。如果您只评估加法,这将没问题,但是从右到左执行“3 - 5 + 2”会给你 -4,而你应该得到 0。考虑使用 infixNotation(以前命名为 operatorPrecedence) 来定义和评估算术和布尔表达式。在 pyparsing.wikispaces.com.

的 pyparsing wiki 上还有几个示例可用