我使用pyparsing解析算术表达式时遇到了问题。 我有以下语法:pyparsing中的setResultName问题
numeric_value = (integer_format | float_format | bool_format)("value*")
identifier = Regex('[a-zA-Z_][a-zA-Z_0-9]*')("identifier*")
operand = numeric_value | identifier
expop = Literal('^')("op")
signop = oneOf('+ -')("op")
multop = oneOf('* /')("op")
plusop = oneOf('+ -')("op")
factop = Literal('!')("op")
arithmetic_expr = infixNotation(operand,
[("!", 1, opAssoc.LEFT),
("^", 2, opAssoc.RIGHT),
(signop, 1, opAssoc.RIGHT),
(multop, 2, opAssoc.LEFT),
(plusop, 2, opAssoc.LEFT),]
)("expr")
我想用这个来解析算术表达式,例如,
expr = "9 + 2 * 3"
parse_result = arithmetic_expr.parseString(expr)
我有两个问题在这里。
首先,当我倾倒的结果,我得到如下:
[['9', '+', ['2', '*', '3']]]
- expr: ['9', '+', ['2', '*', '3']]
- op: '+'
- value: ['9']
相应的XML输出IST:
<result>
<expr>
<value>9</value>
<op>+</op>
<value>
<value>2</value>
<op>*</op>
<value>3</value>
</value>
</expr>
</result>
我想什么有是,['2', '*', '3']
显示为expr
,即,
<result>
<expr>
<value>9</value>
<op>+</op>
<expr>
<value>2</value>
<op>*</op>
<value>3</value>
</expr>
</expr>
</result>
但是,我不确定要使用setResultName()
来实现这一点。
其次,不幸的是,当我想迭代结果时,我获得了简单部分的字符串。因此,我用的是XML“黑客”作为一种解决方法(我的想法从这里:`pyparsing`: iterating over `ParsedResults` 现在是否有更好的方法
问候 阿婆
我对如何另一个小问题?分析结果。 我第一次尝试是使用一个循环,例如像
def recurse_arithmetic_expression(tokens):
for t in tokens:
if t.getResultName() == "value":
pass # do something...
elif t.getResultName() == "identifier":
pass # do something else..
elif t.getResultName() == "op":
pass # do something completely different...
elif isinstance(t, ParseResults):
recurse_arithmetic_expression(t)
然而,不幸的是t
可以是一个字符串或INT /浮动。因此,我得到一个异常,当我尝试打电话getResultName。 不幸的是,如果我使用asDict
,那么令牌的顺序就会丢失。
是否有可能获得一个有序字典和迭代的东西,如
for tag, token in tokens.iteritems():
其中tag
speficies令牌的类型及其键(例如,op, value, identifier, expr...
)和令牌是相应的令牌?
非常感谢你。这符合预期! – Apoptose
我对如何解析结果的简短的跟进质询: – Apoptose
谢谢你,这确实是一个更好的办法! – Apoptose