我正在用dotted.strings
和中缀数学运算符分析字符串。解析本身似乎工作正常,但是getName
返回的名称不是我所期望的。你知道吗
from pyparsing import (Word, alphas, opAssoc, infixNotation,
Suppress, Group, delimitedList, oneOf)
LPAR, RPAR = map(Suppress, "()")
chars = Word(alphas + "_")
colstr = Group(delimitedList(chars, delim=".")).setResultsName("colstr*")
infix_expr = infixNotation(colstr, [
("-", 1, opAssoc.RIGHT),
(oneOf("* /"), 2, opAssoc.LEFT),
(oneOf("+ -"), 2, opAssoc.LEFT),
])("infix")
现在测试一下。。。你知道吗
>>> infix_ex = infix_expr.parseString('a.b + x.y')
>>> print(infix_ex.dump())
[[['a', 'b'], '+', ['x', 'y']]]
- infix: [['a', 'b'], '+', ['x', 'y']]
- colstr: [['a', 'b'], ['x', 'y']]
[0]:
['a', 'b']
[1]:
['x', 'y']
这是我所期望的,但是getName
似乎从错误的解析树级别返回了名称。你知道吗
>>> infix_ex.getName()
'infix'
>>> infix_ex[0].getName()
'colstr'
>>> infix_ex[0].asList()
[['a', 'b'], '+', ['x', 'y']]
如您所见,getName
对于根级别返回'infix',对于树的'infix'级别返回'colstr'。你知道吗
这几乎是不可避免的,因为
getName()
是在ParseResults
上定义的方法,而不是在匹配的标记(可以是字符串,因此不支持getName()
)上定义的方法。你知道吗以下是
ParseResults.getName
文档字符串中的示例:打印内容:
请注意,要使用
getName()
,每个命名位必须是Group
,并且名称在容器上,而不是直接在匹配的令牌上。你知道吗您可以在不是
Group
的元素上定义结果名称,并直接访问它们,而不必获取第[0]
个元素,但是您将无法对它们调用getName()
。你知道吗如果您计划使用
getName()
遍历通过使用infixNotation
解析返回的结构,我建议您为中缀符号语法中的操作数和每个优先级定义自己的容器类。请参阅simple_bool.py
示例代码以了解如何做到这一点。这样,您就可以更直接地控制pyparsing返回给您的对象,而不是试图通过解析的中缀表示法层次结构(并且可能在这个过程中重新跟踪一些解析步骤)。你知道吗相关问题 更多 >
编程相关推荐