Я использую pyparsing для анализа выражения вида:
"and(or(eq(x,1), eq(x,2)), eq(y,3))"
Мой тестовый код выглядит так:
from pyparsing import Word, alphanums, Literal, Forward, Suppress, ZeroOrMore, CaselessLiteral, Group
field = Word(alphanums)
value = Word(alphanums)
eq_ = CaselessLiteral('eq') + Group(Suppress('(') + field + Literal(',').suppress() + value + Suppress(')'))
ne_ = CaselessLiteral('ne') + Group(Suppress('(') + field + Literal(',').suppress() + value + Suppress(')'))
function = ( eq_ | ne_ )
arg = Forward()
and_ = Forward()
or_ = Forward()
arg << (and_ | or_ | function) + Suppress(",") + (and_ | or_ | function) + ZeroOrMore(Suppress(",") + (and_ | function))
and_ << Literal("and") + Suppress("(") + Group(arg) + Suppress(")")
or_ << Literal("or") + Suppress("(") + Group(arg) + Suppress(")")
exp = (and_ | or_ | function)
print(exp.parseString("and(or(eq(x,1), eq(x,2)), eq(y,3))"))
У меня есть вывод в форме:
['and', ['or', ['eq', ['x', '1'], 'eq', ['x', '2']], 'eq', ['y', '3']]]
Вывод списка выглядит нормально. Но для последующей обработки я хотел бы иметь вывод в виде вложенного словаря:
{
name: 'and',
args: [
{
name: 'or',
args: [
{
name: 'eq',
args: ['x','1']
},
{
name: 'eq',
args: ['x','2']
}
]
},
{
name: 'eq',
args: ['y','3']
}
]
}
Я пробовал класс Dict
, но безуспешно.
Можно ли это сделать в pyparsing? Или я должен вручную отформатировать вывод списка?