2

Javaプログラムで実行時に生成された複雑なブール式を評価する方法は?

例:

(x と y または z) と s

x、y、z ブール変数で ...

ありがとう

4

4 に答える 4

1

簡単に言うと、ブール式の「中間表現」が必要です。これはNodeオブジェクトで構成されたツリーです。 には、 、、、および のNodeサブクラスがあります。anには 2 つの childがあり、 anには 2 つの child があり、 aには 1 つの child があります。AndNodeOrNodeNotNodeVariableNodeAndNodeNodeOrNodeNodeNotNodeNode

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は、これに関する非常にシンプルで明確な紹介です。

于 2011-01-30T23:09:43.497 に答える
1

最小限の作業にはhttp://docs.codehaus.org/display/JANINO/Homeを使用してください。単純な表現よりもはるかに多くのことができます。

于 2011-01-31T02:24:26.007 に答える
0

式ツリーを生成し、各リーフをブール値にバインドする必要があります。この式を解析して AST を生成するには、Dijkstra のShunting Yardアルゴリズムを参照してください。そこにはすべてが説明されており、実装するのはかなり簡単です。

于 2011-01-30T22:57:21.197 に答える
0

論理式を評価する方法は? それらのような論理式は構文木として評価でき、この関連する質問Logic expression parserには良い情報があると思います

他に頭に浮かぶのは、論理式をデータとして処理できるようにしたいということです。これは、Jython、JRuby、Groovy、または Scala などのスクリプト言語により適しているように思えます (JVM に制限されている場合)。 . 基本的な式および/または非論理式を処理するパーサーを作成するのは非常に難しいとは思いませんが。

于 2011-01-30T22:24:34.117 に答える