Examples page на Pyparsing вики включает в себя образец SimpleBool.py, который будет анализировать и оценивать такие выражения, как:
test = ["p and not q",
"not not p",
"not(p and q)",
"q or not p and r",
"q or not (p and r)",
"p or q or r",
"p or q or r and False",
]
(Ммм, нет никаких примеров с вложенными скобок, но эти являются . также поддерживается)
Действительное анализатор определяется во всей его полноте, используя этот код:
boolOperand = Word(alphas,max=1) | oneOf("True False")
boolExpr = operatorPrecedence(boolOperand,
[
("not", 1, opAssoc.RIGHT, BoolNot),
("and", 2, opAssoc.LEFT, BoolAnd),
("or", 2, opAssoc.LEFT, BoolOr),
])
В оставшейся части примера приведены реализации BoolNot, BoolOr и BoolAnd. Конструкция operatorPrecedence определяет последовательность операций, их арность и ассоциативность и, необязательно, класс, который должен быть сконструирован с анализируемыми элементами. operatorPrecedence затем заботится об определении грамматики, включая рекурсивное определение boolExpr в вложенных круглых скобках. Полученная структура похожа на вложенный АСТ с использованием заданных классов BoolXxx.Эти классы в свою очередь, определяют eval
методы, так что выражения могут анализироваться и оцениваться с помощью этого кода:
p = True
q = False
r = True
for t in test:
res = boolExpr.parseString(t)[0]
print t,'\n', res, '=', bool(res),'\n'
Pyparsing само по себе является несколько удлиненно модуль, но это единственный исходный файл, поэтому его установка след довольно мал. Лицензия MIT разрешает как некоммерческое, так и коммерческое использование.
Что именно вы пытаетесь сделать? – Gumbo
У меня есть пользовательская JS-реализация на стороне клиента, которая создает такое булевское арифметическое выражение (где a, b, c ... фактически являются поисками полей для последующего использования в фильтрах ORM Django), который затем отправляется на сервер и анализируется с помощью Python , Я надеюсь, что в этом есть смысл. – nikola
Итак, вы хотите разобрать это выражение, чтобы оценить его позже, не так ли? – Gumbo