Le Examples page sur le wiki pyparsing comprend un SimpleBool.py exemple qui analyser et évaluer des expressions telles que:
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",
]
(Hmmm, il n'y a pas d'exemples avec parens imbriqués, mais ceux-ci sont . supporté aussi)
L'analyseur réel est défini dans son intégralité en utilisant le code suivant:
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),
])
Le reste de l'exemple donne les implémentations de BoolNot, BoolOr et BoolAnd. La construction operatorPrecedence définit la séquence des opérations, leur arité et leur associativité, et éventuellement une classe à construire avec les éléments analysés. operatorPrecedence prend ensuite soin de définir la grammaire, y compris la définition récursive de boolExpr dans les parenthèses imbriquées. La structure résultante est similaire à une AST imbriquée utilisant les classes BoolXxx données.Ces classes définissent à leur tour eval
méthodes afin que les expressions peuvent analysées et évaluées en utilisant ce code:
p = True
q = False
r = True
for t in test:
res = boolExpr.parseString(t)[0]
print t,'\n', res, '=', bool(res),'\n'
lui-même pyparsing est un module un peu longuet, mais il est un seul fichier source de sorte que son empreinte d'installation est assez petite. La licence MIT permet à la fois une utilisation non commerciale et commerciale.
Qu'essayez-vous exactement de faire? – Gumbo
J'ai une implémentation JS personnalisée côté client qui produit une telle expression arithmétique booléenne (où a, b, c ... sont des recherches de champs pour une utilisation ultérieure dans les filtres ORM de Django) qui est POSTée sur le serveur et analysée avec Python . J'espère que cela à du sens. – nikola
Donc, vous voulez analyser cette expression pour l'évaluer plus tard, non? – Gumbo