Domanda

Come valutare espressioni booleane complesse generate in fase di esecuzione in un programma Java?

Esempio:

(x e y o z) es

con variabili booleane x, y, z ...

Grazie

È stato utile?

Soluzione

Utilizza http://docs.codehaus.org/display/JANINO/Home per lavoro minimo.Posso fare molto di più che semplici espressioni.

Altri suggerimenti

Molto brevemente, è necessaria una "rappresentazione intermedia" delle espressioni booleane. Questo è un albero formato da oggetti Node. Node ha queste sottoclassi AndNode, OrNode, NotNode e VariableNode. Un AndNode ha due Node secondari, un OrNode ha due Node secondari e un NotNode ha un Node figlio.

Un VariableNode ha solo un nome di variabile String, ad esempio "x". Avresti un HashMap<String, Boolean> in cui ogni chiave del nome di variabile ha un valore booleano associato.

Ogni classe Node ha un metodo eval() che valuta la sua espressione e restituisce un boolean. Il metodo VariableNode.eval() cerca il valore della variabile nel tuo HashMap e lo restituisce. NotNode.eval() restituisce !child.eval(). AndNode.evaluate() restituisce child1.eval() && child2.eval(), mentre OrNode.evaluate() restituisce child1.eval() || child2.eval(). Per valutare un intero albero delle espressioni booleane, basta chiamare il metodo eval() del nodo radice.

È possibile creare questi alberi delle espressioni booleani a livello di codice, utilizzando i costruttori Java, ecc.

Se vuoi costruire i tuoi alberi delle espressioni da stringhe, dovrai scrivere un parser che produca un albero da una stringa. I schemi di implementazione del linguaggio di Terence Parr sono un'introduzione molto semplice e chiara a questo. / p>

Come valutare un'espressione logica?Espressioni logiche come quelle possono essere valutate come un albero della sintassi e penso che ci siano alcune buone informazioni in questa domanda correlata Logicaparser di espressioni

L'altra cosa che mi viene in mente è che vuoi essere in grado di gestire espressioni logiche come dati, il che sembra qualcosa di più adatto a un linguaggio di scripting come forse Jython, JRuby, Groovy o Scala (supponendo che tu sia limitato ala JVM).Anche se dubito che sarebbe molto difficile scrivere un parser per gestire espressioni logiche di base e / o / o non.

Dovrai generare un albero delle espressioni e associare ogni foglia a un valore booleano.Per analizzare questa espressione e generare un AST, dai un'occhiata all'algoritmo Shunting Yard di Dijkstra.Tutto è spiegato qui ed è abbastanza semplice da implementare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top