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

War es hilfreich?

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 Nodes, ein OrNode hat zwei untergeordnete Nodes 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top