У меня проблема с разбором арифметических выражений с использованием pyparsing. У меня есть следующая грамматика:Проблемы с setResultName в 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 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` Есть ли лучший способ в настоящее время
С наилучшими пожеланиями APO
У меня есть еще один маленький вопрос о том, как? анализировать результаты. Моя первая попытка была использовать цикл, как, например,
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. К сожалению, w Я использую asDict
, порядок жетонов утерян.
Можно ли получить упорядоченный Dict и перебирать свои ключи с чем-то вроде
for tag, token in tokens.iteritems():
где tag
speficies типа маркеров (например, op, value, identifier, expr...
) и маркер соответствующего маркера?
спасибо. Это работает так, как ожидалось! – Apoptose
У меня есть короткий вопрос о том, как разобрать результаты: – Apoptose
Спасибо, это действительно лучший подход! – Apoptose