2 Stimmen

Auswertung boolescher Ausdrücke in Java zur Laufzeit generieren

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

1voto

Jim Ferrans Punkte 29952

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.

1voto

maaartinus Punkte 42477

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.

0voto

brabster Punkte 41159

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.

0voto

pnt Punkte 1916

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.com

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.

Powered by:

X