質問

Javaプログラムで実行時に生成される複雑なブール式を評価するにはどうすればよいですか?

例:

(xおよびyまたはz)およびs

x、y、zブール変数を使用...

ありがとう

役に立ちましたか?

解決

http://docs.codehaus.org/display/JANINO/Home を使用します最小限の作業のため。単純な表現以上のことができます。

他のヒント

簡単に言うと、ブール式の「中間表現」が必要です。これは、Nodeオブジェクトで形成されたツリーです。 Nodeには、AndNodeOrNodeNotNode、およびVariableNodeのサブクラスがあります。ジェネラコディセタグコードには2つの子ジェネラコディセタグコードがあり、ジェネラコディセタグコードには2つの子ジェネラコディセタグコードがあり、ジェネラコディセタグコードには1つの子ジェネラコディセタグコードがあります。

AndNodeには、「x」などの変数名Stringがあります。各変数名キーにブール値が関連付けられているNodeがあります。

各ノードクラスには、その式を評価してOrNodeを返すNodeメソッドがあります。 NotNodeメソッドは、Node内の変数の値を検索し、それを返します。 VariableNodeHashMap<String, Boolean>を返します。 eval()booleanを返し、VariableNode.eval()HashMapを返します。ブール式ツリー全体を評価するには、ルートノードのNotNode.eval()メソッドを呼び出すだけです。

これらのブール式ツリーは、Javaコンストラクターなどを使用してプログラムで構築できます。

文字列から式ツリーを構築する場合は、文字列からツリーを生成するパーサーを作成する必要があります。テレンスパールの言語実装パターンは、これを非常にシンプルかつ明確に紹介しています。

論理式を評価する方法は?このような論理式は構文木として評価できます。この関連する質問論理にはいくつかの良い情報があると思います。式パーサー

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

式ツリーを生成し、各リーフをブール値にバインドする必要があります。この式を解析してASTを生成するには、ダイクストラの操車場アルゴリズムをご覧ください。すべてがそこで説明されており、実装はかなり簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top