Javaプログラムで実行時に生成された複雑なブール式を評価する方法は?
例:
(x と y または z) と s
x、y、z ブール変数で ...
ありがとう
Javaプログラムで実行時に生成された複雑なブール式を評価する方法は?
例:
(x と y または z) と s
x、y、z ブール変数で ...
ありがとう
簡単に言うと、ブール式の「中間表現」が必要です。これはNode
オブジェクトで構成されたツリーです。 には、 、、、および のNode
サブクラスがあります。anには 2 つの childがあり、 anには 2 つの child があり、 aには 1 つの child があります。AndNode
OrNode
NotNode
VariableNode
AndNode
Node
OrNode
Node
NotNode
Node
AVariableNode
は変数名 String のみを持ちます (例: "x")。HashMap<String, Boolean>
各変数名キーに関連付けられたブール値がある場所があります。
各 Node クラスには、eval()
式を評価して を返すメソッドがありますboolean
。このVariableNode.eval()
メソッドは、変数の値を検索してHashMap
返します。 NotNode.eval()
戻ります!child.eval()
。 をAndNode.evaluate()
返します。ブール式ツリー全体を評価するには、ルート ノードのメソッドを呼び出すだけです。child1.eval() && child2.eval()
OrNode.evaluate()
child1.eval() || child2.eval()
eval()
Java コンストラクターなどを使用して、これらのブール式ツリーをプログラムで構築できます。
文字列から式ツリーを作成する場合は、文字列からツリーを生成するパーサーを作成する必要があります。Terence Parr のLanguage Implementation Patternsは、これに関する非常にシンプルで明確な紹介です。
最小限の作業にはhttp://docs.codehaus.org/display/JANINO/Homeを使用してください。単純な表現よりもはるかに多くのことができます。
式ツリーを生成し、各リーフをブール値にバインドする必要があります。この式を解析して AST を生成するには、Dijkstra のShunting Yardアルゴリズムを参照してください。そこにはすべてが説明されており、実装するのはかなり簡単です。
論理式を評価する方法は? それらのような論理式は構文木として評価でき、この関連する質問Logic expression parserには良い情報があると思います
他に頭に浮かぶのは、論理式をデータとして処理できるようにしたいということです。これは、Jython、JRuby、Groovy、または Scala などのスクリプト言語により適しているように思えます (JVM に制限されている場合)。 . 基本的な式および/または非論理式を処理するパーサーを作成するのは非常に難しいとは思いませんが。