Wie kann man komplexe boolesche Ausdrücke, die zur Laufzeit in einem Java-Programm generiert werden, auswerten?
Exemple :
(x und y oder z) und s
mit x, y, z booleschen Variablen ...
Merci
Wie kann man komplexe boolesche Ausdrücke, die zur Laufzeit in einem Java-Programm generiert werden, auswerten?
Exemple :
(x und y oder z) und s
mit x, y, z booleschen Variablen ...
Merci
In aller Kürze: Sie benötigen eine "Zwischendarstellung" der booleschen Ausdrücke. Dies ist ein Baum, der aus Node
Objekte. Node
hat die folgenden Unterklassen AndNode
, OrNode
, NotNode
y VariableNode
. Eine AndNode
hat zwei Kinder Node
s, ein OrNode
hat zwei Kinder Node
s, und eine NotNode
hat ein Kind Node
.
A VariableNode
hat nur einen Variablennamen String, z. B. "x". Sie würden eine HashMap<String, Boolean>
wobei jedem Schlüssel für den Variablennamen ein boolescher Wert zugeordnet ist.
Jede Node-Klasse hat eine eval()
Methode, die ihren Ausdruck auswertet und eine boolean
. Die VariableNode.eval()
Methode sucht den Wert der Variablen in Ihrer HashMap
und gibt sie zurück. NotNode.eval()
gibt zurück. !child.eval()
. AndNode.evaluate()
gibt zurück. child1.eval() && child2.eval()
, während OrNode.evaluate()
gibt zurück. child1.eval() || child2.eval()
. Um einen ganzen Baum boolescher Ausdrücke auszuwerten, rufen Sie einfach die Funktion des Wurzelknotens eval()
Methode.
Sie können diese Bäume mit booleschen Ausdrücken programmatisch erstellen, z. B. mit Java-Konstruktoren.
Wenn Sie Ihre Ausdrucksbäume aus Zeichenketten erstellen wollen, müssen Sie einen Parser schreiben, der einen Baum aus einer Zeichenkette erzeugt. Terence Parr's Muster für die Sprachimplementierung ist eine sehr einfache und klare Einführung in dieses Thema.
Verwenden Sie http://docs.codehaus.org/display/JANINO/Home für ein Minimum an Arbeit. Ich kann viel mehr als nur einfache Ausdrücke machen.
Wie wertet man einen logischen Ausdruck aus? Logische Ausdrücke wie diese können als Syntaxbaum ausgewertet werden, und ich denke, dass es einige gute Informationen in dieser verwandten Frage gibt Parser für logische Ausdrücke
Die andere Sache, die mir in den Sinn kommt, ist, dass Sie in der Lage sein wollen, logische Ausdrücke als Daten zu verarbeiten, was eher für eine Skriptsprache wie vielleicht Jython, JRuby, Groovy oder Scala geeignet scheint (vorausgesetzt, Sie sind auf die JVM beschränkt). Obwohl ich bezweifle, dass es sehr schwer wäre, einen Parser zu schreiben, um einfache und/oder/nicht logische Ausdrücke zu verarbeiten.
Sie müssen einen Ausdrucksbaum erstellen und jedes Blatt mit einem booleschen Wert verbinden. Um diesen Ausdruck zu parsen und einen AST zu erzeugen, schauen Sie sich Dijkstras Rangierbahnhof Algorithmus. Darin wird alles erklärt und ist ziemlich einfach zu implementieren.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.