【发布时间】:2016-12-23 16:03:32
【问题描述】:
我在使用 pyparsing 解析算术表达式时遇到问题。 我有以下语法:
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输出列表:
<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“hack”作为解决方法(我从这里得到了这个想法:`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/float。因此,当我尝试调用 getResultName 时出现异常。
不幸的是,当我使用asDict 时,令牌的顺序丢失了。
是否有可能获得 ordered dict 并使用类似
的方式迭代其键for tag, token in tokens.iteritems():
tag 指定令牌的类型(例如,op, value, identifier, expr...),而令牌是对应的令牌?
【问题讨论】:
标签: pyparsing