Question

Comment évaluer complexes expressions booléennes générées lors de l'exécution dans un programme Java?

Exemple:

(x et y ou z) et s

avec x, y, z des variables booléennes ...

Merci

Était-ce utile?

La solution

http://docs.codehaus.org/display/JANINO/Home pour un minimum de travail. Je peux faire beaucoup plus que des expressions simples.

Autres conseils

brièvement Très, vous avez besoin d'une « représentation intermédiaire » des expressions booléennes. Ceci est un arbre formé d'objets Node. Node a AndNode de ièmes, OrNode, NotNode et VariableNode. Un AndNode a deux Nodes enfants, un OrNode a deux Nodes enfants, et un NotNode a un enfant Node.

Un VariableNode a un nom de variable chaîne, par exemple, "x". Vous auriez un HashMap<String, Boolean> où chaque clé de nom variable a une valeur booléenne associée.

Chaque classe de nœud a un procédé de eval() qui évalue l'expression et renvoie un boolean. La méthode de VariableNode.eval() recherche la valeur de la variable dans votre HashMap et le renvoie. retourne NotNode.eval() !child.eval(). retourne AndNode.evaluate() child1.eval() && child2.eval(), alors que les revenus OrNode.evaluate() child1.eval() || child2.eval(). Pour évaluer un arbre d'expression booléenne entier, il suffit d'appeler la méthode de eval() de nœud racine.

Vous pouvez construire ces arbres d'expression booléennes méthode avec les constructeurs Java, etc.

Si vous voulez construire vos arbres d'expression à partir de chaînes, vous aurez besoin d'écrire un analyseur qui produit un arbre à partir d'une chaîne. Terence Parr de Langue modèles de mise en œuvre est une introduction bien simple et claire à ce sujet.

Comment évaluer une expression logique? Les expressions logiques telles que celles-ci peuvent être évalués comme un arbre de syntaxe, et je pense qu'il ya quelques bonnes informations dans cette question connexe Logic analyseur expression

L'autre chose qui vient à l'esprit est que vous voulez être en mesure de traiter les expressions logiques sous forme de données, ce qui semble comme quelque chose de plus adapté à un langage de script comme peut-être Jython, JRuby, Groovy ou Scala (en supposant que vous êtes limité à la machine virtuelle Java). Bien que je doute qu'il serait très difficile d'écrire un analyseur pour gérer de base et / ou / non expressions logiques.

Vous devrez générer un arbre d'expression et se lient chaque feuille à une valeur booléenne. Pour l'analyse syntaxique cette expression et la génération d'un AST jeter un oeil à l'algorithme de Dijkstra Gare de triage. Tout est expliqué là-bas et est assez simples à appliquer.

scroll top