Я использую pyparsing для анализа вложенного выражения, которое формируется списками с разделителями, но включает в себя некоторую базовую арифметику (например, только умножение).
Пример выражения может выглядеть так:
(A, B, 2 * C, 3 * ( D, E, 2 * F, 3 *(G, H)), I )
Выход должен разворачивать арифметику:
( A, B, C, C, D, E, F, F, G, H, G, H, G, H, D, E, F, F, G, H, G, H, G, H, D, E, F, F, G, H, G, H, G, H, I )
Может ли кто-нибудь дать мне подсказку, как подойти к проблеме?
Я начал следующим образом: поскольку есть только операция умножения, я решил использовать символ '*' в качестве разделителя в несколько странном списке:
import pyparsing as pp
oddDelim = pp.Or([',', '*'])
weirdList = pp.Optional(',').suppress() + \
pp.delimitedList(pp.Or([pp.alphas, pp.pyparsing_common.number]), delim = oddDelim, combine = False) + \
pp.Optional('*').suppress()
nestedTest = pp.nestedExpr(content = weirdList)
Используя это выражение nestedTest, я получаю разумный результат:
[['A', 'B', 2, 'C', 3, ['D', 'E', 2, 'F', 3, ['G', 'H']], 'I']]
но я не знаю, как мне разобрать токены, чтобы правильно развернуть арифметику.
Вместо последовательной итерации по токенам в цикле FOR, в идеале я хотел бы начать разворачивать арифметику с наивысшей степени вложенности и постепенно снижаться. Но я не знаю, как ...
Является ли nestedExpr подходом? Или я должен изменить подход и использовать Forward или, возможно, infixNotation? Я очень новичок в pyparsing, я был бы очень признателен, если бы я получил некоторые советы / идеи по этому поводу.
Заранее большое спасибо за помощь!
Ура,
Pau