valuta l'espressione booleana in java generata in fase di esecuzione
-
27-10-2019 - |
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
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.