Evaluieren Sie den booleschen Ausdruck in Java, der zur Laufzeit generiert wird
-
27-10-2019 - |
Frage
Wie werden komplexe boolesche Ausdrücke ausgewertet, die zur Laufzeit in einem Java-Programm generiert werden?
Beispiel:
(x und y oder z) und s
mit booleschen Variablen x, y, z ...
Danke
Lösung
Verwenden Sie http://docs.codehaus.org/display/JANINO/Home für minimale Arbeit.Ich kann viel mehr als nur einfache Ausdrücke.
Andere Tipps
Kurz gesagt, Sie benötigen eine "Zwischendarstellung" der Booleschen Ausdrücke. Dies ist ein Baum, der aus Node
-Objekten besteht. Node
hat diese Unterklassen AndNode
, OrNode
, NotNode
und VariableNode
. Ein AndNode
hat zwei untergeordnete Node
s, ein OrNode
hat zwei untergeordnete Node
s und ein NotNode
hat einen untergeordneten Node
.
Ein VariableNode
hat nur einen Variablennamen String, z. B. "x". Sie hätten einen HashMap<String, Boolean>
, bei dem jedem Variablennamenschlüssel ein boolescher Wert zugeordnet ist.
Jede Node-Klasse verfügt über eine eval()
-Methode, die ihren Ausdruck auswertet und einen boolean
zurückgibt. Die VariableNode.eval()
-Methode sucht den Wert der Variablen in Ihrem HashMap
und gibt ihn zurück. NotNode.eval()
gibt !child.eval()
zurück. AndNode.evaluate()
gibt child1.eval() && child2.eval()
zurück, während OrNode.evaluate()
child1.eval() || child2.eval()
zurückgibt. Um einen gesamten booleschen Ausdrucksbaum auszuwerten, rufen Sie einfach die eval()
-Methode des Stammknotens auf.
Sie können diese booleschen Ausdrucksbäume programmgesteuert mithilfe von Java-Konstruktoren usw. erstellen.
Wenn Sie Ihre Ausdrucksbäume aus Zeichenfolgen erstellen möchten, müssen Sie einen Parser schreiben, der aus einer Zeichenfolge einen Baum erstellt. Terence Parrs Sprachimplementierungsmuster ist eine sehr einfache und klare Einführung in diese.
Wie wird ein logischer Ausdruck ausgewertet?Logische Ausdrücke wie diese können als Syntaxbaum ausgewertet werden, und ich denke, dass diese verwandte Frage einige gute Informationen enthält: LogikAusdrucksparser
Das andere, was Ihnen in den Sinn kommt, ist, dass Sie in der Lage sein möchten, logische Ausdrücke als Daten zu verarbeiten, was für eine Skriptsprache wie Jython, JRuby, Groovy oder Scala besser geeignet zu sein scheint (vorausgesetzt, Sie sind darauf beschränktdie JVM).Obwohl ich bezweifle, dass es sehr schwierig sein würde, einen Parser für grundlegende und / oder nicht logische Ausdrücke zu schreiben.
Sie müssen einen Ausdrucksbaum generieren und jedes Blatt an einen booleschen Wert binden.Um diesen Ausdruck zu analysieren und einen AST zu generieren, werfen Sie einen Blick auf den Shunting Yard -Algorithmus von Dijkstra.Dort wird alles erklärt und ist ziemlich einfach umzusetzen.